Package-Pkg
view release on metacpan or search on metacpan
lib/Package/Pkg.pm view on Meta::CPAN
return;
};
}
# pkg->install( name => sub { ... } =>
sub install {
my $self = shift;
my %install;
if ( @_ == 1 ) { %install = %{ $_[0] } }
elsif ( @_ == 2 ) {
if ( $_[1] && $_[1] =~ m/::$/ ) { @install{qw/ code into /} = @_ }
else { @install{qw/ code as /} = @_ }
}
elsif ( @_ == 3 ) { @install{qw/ code into as /} = @_ }
else { %install = @_ }
my ( $from, $code, $into, $_into, $as, ) = @install{qw/ from code into _into as /};
undef %install;
die "Missing code (@_)" unless defined $code;
if ( ref $code eq 'CODE' ) {
die "Invalid (superfluous) from ($from) with code reference (@_)" if defined $from;
}
else {
if ( defined $from )
{ die "Invalid code ($code) with from ($from)" if $code =~ m/::/ }
elsif ( $code =~ m/::/) {
$code =~ s/^<//; # Silently allow <Package::subroutine
( $from, $code ) = $self->split2( $code );
}
else { $from = caller }
}
if ( defined $as && $as =~ m/::/) {
die "Invalid as ($as) with into ($into)" if defined $into;
( $into, $as ) = $self->split2( $as );
}
elsif ( defined $into ) {
if ( $into =~ s/::$// ) { }
}
elsif ( defined $_into ) {
$into = $_into;
}
if ( defined $as ) {}
elsif ( ! ref $code ) { $as = $code }
else { die "Missing as (@_)" }
die "Missing into (@_)" unless defined $into;
@install{qw/ code into as /} = ( $code, $into, $as );
$install{from} = $from if defined $from;
Sub::Install::install_sub( \%install );
}
sub split {
my $self = shift;
my $target = shift;
return unless defined $target && length $target;
return split m/::/, $target;
}
sub split2 {
my $self = shift;
return unless my @split = $self->split( @_ );
return $split[0] if 1 == @split;
my $name = pop @split;
return( join( '::', @split ), $name );
}
sub export {
my $self = shift;
my $exporter = $self->exporter( @_ );
my $package = caller;
$self->install( code => $exporter, as => "${package}::import" );
}
sub exporter {
my $self = shift;
my ( %index, %group, $default_export );
%group = ( default => [], optional => [], all => [] );
$default_export = 1;
while ( @_ ) {
local $_ = shift;
my ( $group, @install );
if ( $_ eq '-' ) { undef $default_export }
elsif ( $_ eq '+' ) { $default_export = 1 }
elsif ( s/^\+// ) { $group = 'default' }
elsif ( s/^\-// ) { $group = 'optional' }
elsif ( $default_export ) { $group = 'default' }
else { $group = 'optional' }
my $name = $_;
push @install, $name;
if ( @_ ) {
my $value = shift;
if ( ref $value eq 'CODE' ) { push @install, $value }
elsif ( $value =~ s/^<// ) { push @install, $value }
else { unshift @_, $value }
}
push @{ $group{$group} ||= [] }, $name;
$index{$name} = \@install;
}
$group{all} = [ map { @$_ } @group{qw/ default optional /} ];
my $exporter = sub {
my ( $class ) = @_;
my $package = caller;
my @arguments = splice @_, 1;
my @exporting;
if ( ! @arguments ) {
push @exporting, @{ $group{default} };
}
else {
( run in 0.760 second using v1.01-cache-2.11-cpan-71847e10f99 )