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 as:
use 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 to control the names of the exported routines in its name space 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 exports;
#______________________________________________________________________
# 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;