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
Copyright
philiprbrenan@yahoo.com, 2004
License
Perl License.