Exports

Export routines from a package with names specified by caller of the package.

Synopsis

 use Math::Zap::Vector vector=>'v', units=>'u';

 my $x = v(1,0,0);
 my $y = u();

Rather than:

 my $x = Math::Zap::Vector::vector(1,0,0);
 my $y = Math::Zap::Vector::units();

Description

Export routines from a package with names specified by caller of the package. The routines to be exported are defined in the exporting package Math::Zap::As: $VERSION=1.07;

 use Math::Zap::Exports qw(
   vector ($$$)
   units  ()
 );

A suitable sub import() is created, allowing the caller to specify:

 use Math::Zap::Vector vector=>'v', units=>'u';

The caller may then refer to Math::Zap::Vector::vector() as v() and Math::Zap::Vector::units() as u().

The first routine exported is always imported by its export name unless a new name is supplied. Thus:

 use Math::Zap::Vector;

and

 use Math::Zap::Vector vector=>'vector';

have identical effects.

The advantage of this is approach is that it allows the importing package Math::Zap::To control the names of the exported routines in its name space $VERSION=1.07; rather than the developer of the exporting package, a facility I have not been able to discover in the standard Perl Exporter.pm.

PhilipRBrenan@yahoo.com, 2004, Perl licence

Method: Exports

Construct import routine.

 ##1
 package Math::Zap::Exports;
 $VERSION=1.07;
 
 #______________________________________________________________________
 # Import for exports: export from exporting package.
 #______________________________________________________________________
 
 sub import(@)
  {shift @_;               # Remove 'exports'
   scalar(@_) % 2 and      # Check number of parameters is even
     die "use exports: Odd number of parameters";
   my $q = join(' ', @_);  # Stringify parameters
   my $p = (caller())[0];  # Exporting package
   my $s =                 # Push data into space of exporting package 
 '@'.$p.'::EXPORTS = qw('.$q.');';
   eval $s; die $@ if $@;  # Perform push and check it worked
 # print "AAAA ", join(' ', @zzz::EXPORTS), "\n"; # Print pushed data
 
 #______________________________________________________________________
 # Construct import routine for exporting package.
 #______________________________________________________________________
 
   $s  = 'pack'."age $p;\n". <<'END'; # Switch to exporting package
 sub import(@)
  {shift @_;
   my @p = ($EXPORTS[0], $EXPORTS[0], @_);
   scalar(@p) % 2 and die "Odd number of parameters";
 
 # Edit parameters and convert to hash
   s/^-// for(@p);
   my %p = @p;
 
 # Switch to package requesting exported methods
   my $c = __PACKAGE__;    # Save exporting package
   my $s =                 # Switch to importing package   
 'pack'.'age '.(caller())[0].";\n".
 'no warnings \'redefine\';'."\n";
 
 # Export valid methods
   my %e = @EXPORTS;
   for my $p(keys(%p))
    {defined $e{$p} or
       die "use $c: Bad method: $p requested.\nValid methods are ".
           join(', ', sort(keys(%e))). "\n";
     $s .= 'sub '.$p{$p}.$e{$p}.' {&'.$c.'::'.$p.'(@_)}'."\n";
    }
 
 # Back to exporting package
   $s .= 'use warnings \'redefine\';'."\n".
         'pack'.'age '.$c.";\n";
 
 # Push exports
 # print "BBBB $s\n";
   eval($s); die $@ if $@;
  }
 END
 
 #______________________________________________________________________
 # Push import routine  
 #______________________________________________________________________
 
 # print "CCCC $s\n";
   eval($s); die $@ if $@;
  }
 
 ##2
 #______________________________________________________________________
 # Package installed successfully
 #______________________________________________________________________
 
 1;
 
 

Credits

Author

philiprbrenan@yahoo.com

philiprbrenan@yahoo.com, 2004

License

Perl License.