package SAPNW::RFC::FunctionDescriptor; =pod Copyright (c) 2006 - 2007 Piers Harding. All rights reserved. =cut use strict; use SAPNW::Base; use base qw(SAPNW::Base); use vars qw($VERSION $AUTOLOAD); $VERSION = '0.03'; sub AUTOLOAD { my $self = shift; my @parms = @_; my $type = ref($self) || die "cannot autoload in FunctionDescriptor with $self -> $AUTOLOAD\n"; my $name = $AUTOLOAD; $name =~ s/.*://; # Autoload parameters and tables if ( exists $self->{parameters}->{$name} ) { return $self->{parameters}->{$name}; } else { #debug(Dumper($self)); die "Parameter $name does not exist in Interface Descriptor - no autoload"; }; } sub DESTROY { my $self = shift; return SAPNW::Connection::destroy_function_descriptor($self); } sub new { my $proto = shift; my $class = ref($proto) || $proto; my ($name) = @_; return SAPNW::Connection::create_function_descriptor($name); } sub name { my $self = shift; return $self->{name}; } # internal method used to add parameters from within the C extension sub addParameter { my $self = shift; my ($name, $direction, $type, $len, $ulen, $decimals) = @_; #debug("parm: $name direction: $direction type: $type len: $len decimals: $decimals\n"); if (ref($name) eq "SAPNW::RFC::Export" || ref($name) eq "SAPNW::RFC::Import" || ref($name) eq "SAPNW::RFC::Changing" || ref($name) eq "SAPNW::RFC::Table") { my $k = $name->name; $self->{parameters}->{$k} = SAPNW::Connection::add_parameter($self, $name); return $self->{parameters}->{$k}; } my $p; if ($direction == RFCIMPORT) { if (exists $self->{parameters}->{$name} && $self->{parameters}->{$name}->direction == RFCEXPORT) { $p = SAPNW::RFC::Changing->new(name => $name, type => $type, len => $len, ulen => $ulen, decimals => $decimals); } else { $p = SAPNW::RFC::Import->new(name => $name, type => $type, len => $len, ulen => $ulen, decimals => $decimals); } } elsif ($direction == RFCEXPORT) { if (exists $self->{parameters}->{$name} && $self->{parameters}->{$name}->direction == RFCIMPORT) { $p = SAPNW::RFC::Changing->new(name => $name, type => $type, len => $len, ulen => $ulen, decimals => $decimals); } else { $p = SAPNW::RFC::Export->new(name => $name, type => $type, len => $len, ulen => $ulen, decimals => $decimals); } } elsif ($direction == RFCCHANGING) { $p = SAPNW::RFC::Changing->new(name => $name, type => $type, len => $len, ulen => $ulen, decimals => $decimals); } elsif ($direction == RFCTABLES) { $p = SAPNW::RFC::Table->new(name => $name, type => $type, len => $len, ulen => $ulen, decimals => $decimals); } else { die "unknown direction ($name): $direction\n"; } $self->{parameters}->{$p->name} = $p; return $p; } sub parameters { my $self = shift; return $self->{parameters}; } sub callback { my $self = shift; $self->{'callback'} = shift if scalar @_ == 1; return $self->{'callback'}; } sub make_empty_function_call { my $self = shift; return SAPNW::RFC::FunctionCall->new($self); } sub create_function_call { my $self = shift; #debug("create_function_call: ".Dumper($self)); return SAPNW::Connection::create_function_call($self); } 1;