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.