diff options
| author | fukachan <fukachan> | 2012-04-15 07:19:36 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2012-04-15 07:19:36 +0000 |
| commit | 06f7fe124e0769fc833d024af3de0785411a1755 (patch) | |
| tree | cf9142df3bbc07a906650cf82688d9aa0af23920 | |
| parent | 88eff9693d5bb7af208cb373628b4f66d6d85582 (diff) | |
| download | fml8-06f7fe124e0769fc833d024af3de0785411a1755.tar.gz fml8-06f7fe124e0769fc833d024af3de0785411a1755.tar.bz2 fml8-06f7fe124e0769fc833d024af3de0785411a1755.zip | |
Initial revision
| -rw-r--r-- | cpan/dist/Exporter-Lite-0.02/MANIFEST | 7 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite-0.02/META.yml | 12 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite-0.02/Makefile.PL | 54 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite-0.02/SIGNATURE | 29 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite-0.02/lib/Exporter/Lite.pm | 196 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite-0.02/t/Exporter-Lite.t | 106 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite-0.02/t/lib/Dummy.pm | 23 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite/MANIFEST | 7 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite/META.yml | 12 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite/Makefile.PL | 54 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite/SIGNATURE | 29 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite/lib/Exporter/Lite.pm | 196 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite/t/Exporter-Lite.t | 106 | ||||
| -rw-r--r-- | cpan/dist/Exporter-Lite/t/lib/Dummy.pm | 23 | ||||
| -rw-r--r-- | cpan/lib/Exporter/Lite.pm | 196 |
15 files changed, 1050 insertions, 0 deletions
diff --git a/cpan/dist/Exporter-Lite-0.02/MANIFEST b/cpan/dist/Exporter-Lite-0.02/MANIFEST new file mode 100644 index 00000000..2e4748df --- /dev/null +++ b/cpan/dist/Exporter-Lite-0.02/MANIFEST @@ -0,0 +1,7 @@ +MANIFEST +Makefile.PL +lib/Exporter/Lite.pm +t/Exporter-Lite.t +t/lib/Dummy.pm +META.yml Module meta-data (added by MakeMaker) +SIGNATURE Public-key signature (added by MakeMaker) diff --git a/cpan/dist/Exporter-Lite-0.02/META.yml b/cpan/dist/Exporter-Lite-0.02/META.yml new file mode 100644 index 00000000..eb374942 --- /dev/null +++ b/cpan/dist/Exporter-Lite-0.02/META.yml @@ -0,0 +1,12 @@ +--- #YAML:1.0 +name: Exporter-Lite +version: 0.02 +abstract: ~ +license: perl +generated_by: ExtUtils::MakeMaker version 6.31 +distribution_type: module +requires: + Test::More: 0.34 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 diff --git a/cpan/dist/Exporter-Lite-0.02/Makefile.PL b/cpan/dist/Exporter-Lite-0.02/Makefile.PL new file mode 100644 index 00000000..12e4fb25 --- /dev/null +++ b/cpan/dist/Exporter-Lite-0.02/Makefile.PL @@ -0,0 +1,54 @@ +#!/usr/bin/perl -w + +use ExtUtils::MakeMaker; + +$PACKAGE = 'Exporter::Lite'; +($PACKAGE_FILE = $PACKAGE) =~ s|::|/|g; +$LAST_API_CHANGE = 0; + +eval "require $PACKAGE"; + +unless ($@) { # Make sure we did find the module. + print <<"CHANGE_WARN" if ${$PACKAGE.'::VERSION'} < $LAST_API_CHANGE; + +NOTE: There have been API changes between this version and any older +than version $LAST_API_CHANGE! Please read the Changes file if you +are upgrading from a version older than $LAST_API_CHANGE. + +CHANGE_WARN +} + +WriteMakefile( + NAME => $PACKAGE, + VERSION_FROM => "lib/$PACKAGE_FILE.pm", # finds $VERSION + PREREQ_PM => { + Test::More => 0.34 + }, + ($ExtUtils::MakeMaker::VERSION <= 6.31 ? (LICENSE => 'perl') : ()), +); + + +{ + package MY; + + sub test_via_harness { + my($self, $orig_perl, $tests) = @_; + + my @perls = ($orig_perl); + push @perls, qw(bleadperl + perl5.6.1 + perl5.6.0 + perl5.005_03 + perl5.004_05 + perl5.004_04 + perl5.004) + if $ENV{PERL_TEST_ALL}; + + my $out; + foreach my $perl (@perls) { + $out .= $self->SUPER::test_via_harness($perl, $tests); + } + + return $out; + } +} diff --git a/cpan/dist/Exporter-Lite-0.02/SIGNATURE b/cpan/dist/Exporter-Lite-0.02/SIGNATURE new file mode 100644 index 00000000..d7753d6f --- /dev/null +++ b/cpan/dist/Exporter-Lite-0.02/SIGNATURE @@ -0,0 +1,29 @@ +This file contains message digests of all files listed in MANIFEST, +signed via the Module::Signature module, version 0.55. + +To verify the content in this distribution, first make sure you have +Module::Signature installed, then type: + + % cpansign -v + +It will check each file's integrity, as well as the signature's +validity. If "==> Signature verified OK! <==" is not displayed, +the distribution may already have been compromised, and you should +not run its Makefile.PL or Build.PL. + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +SHA1 37dc36a06aa00dbfc85d43390ce4d03e25b3eddd MANIFEST +SHA1 a938d857885a4ac9421bc3b640568f24a0d9ca2d META.yml +SHA1 68983e2578d6936968dc147d0d19c12e99aefa66 Makefile.PL +SHA1 f1ff6ad424b0ba6a4dc03b1bbfa4152b6a1ad3cc lib/Exporter/Lite.pm +SHA1 89a622e04817b25dae1cdf51b56f25c7b3432fbd t/Exporter-Lite.t +SHA1 7154c027605cbb43345a88a80d5fd82184d68652 t/lib/Dummy.pm +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.5 (Darwin) + +iD8DBQFFVma6WMohlhD1QycRAp2KAKC9vpMDK40IyF3Xqer6JdArbkaBxACfWbyw +4inSb0Z1PP7eFQezUIWYGOg= +=G7lI +-----END PGP SIGNATURE----- diff --git a/cpan/dist/Exporter-Lite-0.02/lib/Exporter/Lite.pm b/cpan/dist/Exporter-Lite-0.02/lib/Exporter/Lite.pm new file mode 100644 index 00000000..c7224876 --- /dev/null +++ b/cpan/dist/Exporter-Lite-0.02/lib/Exporter/Lite.pm @@ -0,0 +1,196 @@ +package Exporter::Lite; + +require 5.004; + +# Using strict or vars almost doubles our load time. Turn them back +# on when debugging. +#use strict 'vars'; # we're going to be doing a lot of sym refs +#use vars qw($VERSION @EXPORT); + +$VERSION = 0.02; +@EXPORT = qw(import); # we'll know pretty fast if it doesn't work :) + + + +sub import { + my($exporter, @imports) = @_; + my($caller, $file, $line) = caller; + + unless( @imports ) { # Default import. + @imports = @{$exporter.'::EXPORT'}; + } + else { + # Because @EXPORT_OK = () would indicate that nothing is + # to be exported, we cannot simply check the length of @EXPORT_OK. + # We must to oddness to see if the variable exists at all as + # well as avoid autovivification. + # XXX idea stolen from base.pm, this might be all unnecessary + my $eokglob; + if( $eokglob = ${$exporter.'::'}{EXPORT_OK} and *$eokglob{ARRAY} ) { + if( @{$exporter.'::EXPORT_OK'} ) { + # This can also be cached. + my %ok = map { s/^&//; $_ => 1 } @{$exporter.'::EXPORT_OK'}, + @{$exporter.'::EXPORT'}; + + my($denied) = grep {s/^&//; !$ok{$_}} @imports; + _not_exported($denied, $exporter, $file, $line) if $denied; + } + else { # We don't export anything. + _not_exported($imports[0], $exporter, $file, $line); + } + } + } + + _export($caller, $exporter, @imports); +} + + + +sub _export { + my($caller, $exporter, @imports) = @_; + + # Stole this from Exporter::Heavy. I'm sure it can be written better + # but I'm lazy at the moment. + foreach my $sym (@imports) { + # shortcut for the common case of no type character + (*{$caller.'::'.$sym} = \&{$exporter.'::'.$sym}, next) + unless $sym =~ s/^(\W)//; + + my $type = $1; + my $caller_sym = $caller.'::'.$sym; + my $export_sym = $exporter.'::'.$sym; + *{$caller_sym} = + $type eq '&' ? \&{$export_sym} : + $type eq '$' ? \${$export_sym} : + $type eq '@' ? \@{$export_sym} : + $type eq '%' ? \%{$export_sym} : + $type eq '*' ? *{$export_sym} : + do { require Carp; Carp::croak("Can't export symbol: $type$sym") }; + } +} + + +#"# +sub _not_exported { + my($thing, $exporter, $file, $line) = @_; + die sprintf qq|"%s" is not exported by the %s module at %s line %d\n|, + $thing, $exporter, $file, $line; +} + +1; + +__END__ + +=head1 NAME + +Exporter::Lite - Lightweight exporting of variables + +=head1 SYNOPSIS + + package Foo; + use Exporter::Lite; + + # Just like Exporter. + @EXPORT = qw($This That); + @EXPORT_OK = qw(@Left %Right); + + + # Meanwhile, in another piece of code! + package Bar; + use Foo; # exports $This and &That. + + +=head1 DESCRIPTION + +This is an alternative to Exporter intended to provide a lightweight +subset of its functionality. It supports C<import()>, C<@EXPORT> and +C<@EXPORT_OK> and not a whole lot else. + +Unlike Exporter, it is not necessary to inherit from Exporter::Lite +(ie. no C<@ISA = qw(Exporter::Lite)> mantra). Exporter::Lite simply +exports its import() function. This might be called a "mix-in". + +Setting up a module to export its variables and functions is simple: + + package My::Module; + use Exporter::Lite; + + @EXPORT = qw($Foo bar); + +now when you C<use My::Module>, C<$Foo> and C<bar()> will show up. + +In order to make exporting optional, use @EXPORT_OK. + + package My::Module; + use Exporter::Lite; + + @EXPORT_OK = qw($Foo bar); + +when My::Module is used, C<$Foo> and C<bar()> will I<not> show up. +You have to ask for them. C<use My::Module qw($Foo bar)>. + +=head1 Methods + +Export::Lite has one public method, import(), which is called +automaticly when your modules is use()'d. + +In normal usage you don't have to worry about this at all. + +=over 4 + +=item B<import> + + Some::Module->import; + Some::Module->import(@symbols); + +Works just like C<Exporter::import()> excepting it only honors +@Some::Module::EXPORT and @Some::Module::EXPORT_OK. + +The given @symbols are exported to the current package provided they +are in @Some::Module::EXPORT or @Some::Module::EXPORT_OK. Otherwise +an exception is thrown (ie. the program dies). + +If @symbols is not given, everything in @Some::Module::EXPORT is +exported. + +=back + +=head1 DIAGNOSTICS + +=over 4 + +=item '"%s" is not exported by the %s module' + +Attempted to import a symbol which is not in @EXPORT or @EXPORT_OK. + +=item 'Can\'t export symbol: %s' + +Attempted to import a symbol of an unknown type (ie. the leading $@% salad +wasn't recognized). + +=back + +=head1 BUGS and CAVEATS + +Its not yet clear if this is actually any lighter or faster than +Exporter. I know its at least on par. + +OTOH, the docs are much clearer and not having to say C<@ISA = +qw(Exporter)> is kinda nice. + +=head1 AUTHORS + +Michael G Schwern <schwern@pobox.com> + +=head1 LICENSE + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F<http://www.perl.com/perl/misc/Artistic.html> + +=head1 SEE ALSO + +L<Exporter>, L<Exporter::Simple>, L<UNIVERSAL::exports> + +=cut diff --git a/cpan/dist/Exporter-Lite-0.02/t/Exporter-Lite.t b/cpan/dist/Exporter-Lite-0.02/t/Exporter-Lite.t new file mode 100644 index 00000000..42e26272 --- /dev/null +++ b/cpan/dist/Exporter-Lite-0.02/t/Exporter-Lite.t @@ -0,0 +1,106 @@ +#!/usr/bin/perl -w + +use lib qw(t/lib); + +use Test::More tests => 30; + +BEGIN { use_ok('Exporter::Lite'); } +can_ok(__PACKAGE__, 'import'); + +{ + package Test1; + use Dummy; + + ::can_ok('Dummy', 'import'); + ::ok( defined &foo, '@EXPORT' ); + ::is( foo, 42, ' in one piece' ); + ::is( $foo, 'foofer', ' and variables' ); +} + +{ + package YATest1; + use Dummy qw(foo); + + ::ok( defined &foo, '@EXPORT with explicit request' ); + ::is( foo, 42, ' in one piece' ); +} + +{ + package Test2; + use Dummy (); + + ::ok( !defined &foo, 'import with ()' ); +} + +{ + package Test3; + eval { Dummy->import('car') }; + ::like( $@, '/"car" is not exported by the Dummy module/', + 'importing non-expoted function' ); +} + + +{ + package Test4; + use Dummy qw(bar); + ::ok( defined &bar, '@EXPORT_OK' ); + ::ok( !defined &foo, ' overrides @EXPORT' ); + ::ok( !defined &my_sum, ' only what we asked for from @EXPORT_OK' ); + ::is( bar, 23, ' not damaged in transport' ); +} + +{ + package YATest4; + use Dummy qw(bar $bar); + ::ok( defined &bar, '@EXPORT_OK' ); + ::ok( !defined &foo, ' overrides @EXPORT' ); + ::ok( !defined &my_sum, ' only what we asked for from @EXPORT_OK' ); + ::is( bar, 23, ' not damaged in transport' ); + ::is( $bar, 'barfer', ' $bar exported' ); +} + +{ + package Test5; + + my $warning = ''; + local $SIG{__WARN__} = sub { $warning = join '', @_ }; + eval 'use Dummy qw(bar)'; + eval 'use Dummy qw(&bar)'; + ::ok( defined &bar, 'importing multiple times' ); + ::is( $@, '', ' no errors' ); + ::is( $warning, '', ' no warnings' ); +} + +{ + package Test6; + + my $warning = ''; + local $SIG{__WARN__} = sub { $warning = join '', @_ }; + eval 'use Dummy qw(bar &bar bar bar &bar bar)'; + ::ok( defined &bar, 'importing duplicates' ); + ::is( $@, '', ' no errors' ); + ::is( $warning, '', ' no warnings' ); +} + +{ + package Test7; + use Dummy qw(my_sum bar foo); + + ::is( prototype("Dummy::my_sum"), '&@', 'imported sub has prototype' ); + ::is( prototype("my_sum"), '&@', ' prototype preserved' ); + + my @list = qw(1 2 3 4); + my $sum = my_sum { $_[0] + $_[1] } @list; + ::is( $sum, 10, ' and it works' ); +} + + +{ + package Test8; + eval "use Dummy 0.5"; + ::is( $@, '', 'use Foo VERSION' ); + + eval "use Dummy 99"; + ::like( $@, '/Dummy version 99.* required/', + 'use with version check' ); +} diff --git a/cpan/dist/Exporter-Lite-0.02/t/lib/Dummy.pm b/cpan/dist/Exporter-Lite-0.02/t/lib/Dummy.pm new file mode 100644 index 00000000..1c05cee0 --- /dev/null +++ b/cpan/dist/Exporter-Lite-0.02/t/lib/Dummy.pm @@ -0,0 +1,23 @@ +package Dummy; + +use Exporter::Lite; +@EXPORT = qw(&foo $foo); +@EXPORT_OK = qw(&bar my_sum $bar); +$VERSION = 0.5; + +$foo = 'foofer'; +sub foo { 42 } + +$bar = 'barfer'; +sub bar { 23 } + +sub my_sum (&@) { + my($sub, @list) = @_; + + foreach (@list) { $sum = $sub->($_, $sum || 0); } + return $sum; +} + +sub car { "yarblockos" } + +return 23; diff --git a/cpan/dist/Exporter-Lite/MANIFEST b/cpan/dist/Exporter-Lite/MANIFEST new file mode 100644 index 00000000..2e4748df --- /dev/null +++ b/cpan/dist/Exporter-Lite/MANIFEST @@ -0,0 +1,7 @@ +MANIFEST +Makefile.PL +lib/Exporter/Lite.pm +t/Exporter-Lite.t +t/lib/Dummy.pm +META.yml Module meta-data (added by MakeMaker) +SIGNATURE Public-key signature (added by MakeMaker) diff --git a/cpan/dist/Exporter-Lite/META.yml b/cpan/dist/Exporter-Lite/META.yml new file mode 100644 index 00000000..eb374942 --- /dev/null +++ b/cpan/dist/Exporter-Lite/META.yml @@ -0,0 +1,12 @@ +--- #YAML:1.0 +name: Exporter-Lite +version: 0.02 +abstract: ~ +license: perl +generated_by: ExtUtils::MakeMaker version 6.31 +distribution_type: module +requires: + Test::More: 0.34 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 diff --git a/cpan/dist/Exporter-Lite/Makefile.PL b/cpan/dist/Exporter-Lite/Makefile.PL new file mode 100644 index 00000000..12e4fb25 --- /dev/null +++ b/cpan/dist/Exporter-Lite/Makefile.PL @@ -0,0 +1,54 @@ +#!/usr/bin/perl -w + +use ExtUtils::MakeMaker; + +$PACKAGE = 'Exporter::Lite'; +($PACKAGE_FILE = $PACKAGE) =~ s|::|/|g; +$LAST_API_CHANGE = 0; + +eval "require $PACKAGE"; + +unless ($@) { # Make sure we did find the module. + print <<"CHANGE_WARN" if ${$PACKAGE.'::VERSION'} < $LAST_API_CHANGE; + +NOTE: There have been API changes between this version and any older +than version $LAST_API_CHANGE! Please read the Changes file if you +are upgrading from a version older than $LAST_API_CHANGE. + +CHANGE_WARN +} + +WriteMakefile( + NAME => $PACKAGE, + VERSION_FROM => "lib/$PACKAGE_FILE.pm", # finds $VERSION + PREREQ_PM => { + Test::More => 0.34 + }, + ($ExtUtils::MakeMaker::VERSION <= 6.31 ? (LICENSE => 'perl') : ()), +); + + +{ + package MY; + + sub test_via_harness { + my($self, $orig_perl, $tests) = @_; + + my @perls = ($orig_perl); + push @perls, qw(bleadperl + perl5.6.1 + perl5.6.0 + perl5.005_03 + perl5.004_05 + perl5.004_04 + perl5.004) + if $ENV{PERL_TEST_ALL}; + + my $out; + foreach my $perl (@perls) { + $out .= $self->SUPER::test_via_harness($perl, $tests); + } + + return $out; + } +} diff --git a/cpan/dist/Exporter-Lite/SIGNATURE b/cpan/dist/Exporter-Lite/SIGNATURE new file mode 100644 index 00000000..d7753d6f --- /dev/null +++ b/cpan/dist/Exporter-Lite/SIGNATURE @@ -0,0 +1,29 @@ +This file contains message digests of all files listed in MANIFEST, +signed via the Module::Signature module, version 0.55. + +To verify the content in this distribution, first make sure you have +Module::Signature installed, then type: + + % cpansign -v + +It will check each file's integrity, as well as the signature's +validity. If "==> Signature verified OK! <==" is not displayed, +the distribution may already have been compromised, and you should +not run its Makefile.PL or Build.PL. + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +SHA1 37dc36a06aa00dbfc85d43390ce4d03e25b3eddd MANIFEST +SHA1 a938d857885a4ac9421bc3b640568f24a0d9ca2d META.yml +SHA1 68983e2578d6936968dc147d0d19c12e99aefa66 Makefile.PL +SHA1 f1ff6ad424b0ba6a4dc03b1bbfa4152b6a1ad3cc lib/Exporter/Lite.pm +SHA1 89a622e04817b25dae1cdf51b56f25c7b3432fbd t/Exporter-Lite.t +SHA1 7154c027605cbb43345a88a80d5fd82184d68652 t/lib/Dummy.pm +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.5 (Darwin) + +iD8DBQFFVma6WMohlhD1QycRAp2KAKC9vpMDK40IyF3Xqer6JdArbkaBxACfWbyw +4inSb0Z1PP7eFQezUIWYGOg= +=G7lI +-----END PGP SIGNATURE----- diff --git a/cpan/dist/Exporter-Lite/lib/Exporter/Lite.pm b/cpan/dist/Exporter-Lite/lib/Exporter/Lite.pm new file mode 100644 index 00000000..c7224876 --- /dev/null +++ b/cpan/dist/Exporter-Lite/lib/Exporter/Lite.pm @@ -0,0 +1,196 @@ +package Exporter::Lite; + +require 5.004; + +# Using strict or vars almost doubles our load time. Turn them back +# on when debugging. +#use strict 'vars'; # we're going to be doing a lot of sym refs +#use vars qw($VERSION @EXPORT); + +$VERSION = 0.02; +@EXPORT = qw(import); # we'll know pretty fast if it doesn't work :) + + + +sub import { + my($exporter, @imports) = @_; + my($caller, $file, $line) = caller; + + unless( @imports ) { # Default import. + @imports = @{$exporter.'::EXPORT'}; + } + else { + # Because @EXPORT_OK = () would indicate that nothing is + # to be exported, we cannot simply check the length of @EXPORT_OK. + # We must to oddness to see if the variable exists at all as + # well as avoid autovivification. + # XXX idea stolen from base.pm, this might be all unnecessary + my $eokglob; + if( $eokglob = ${$exporter.'::'}{EXPORT_OK} and *$eokglob{ARRAY} ) { + if( @{$exporter.'::EXPORT_OK'} ) { + # This can also be cached. + my %ok = map { s/^&//; $_ => 1 } @{$exporter.'::EXPORT_OK'}, + @{$exporter.'::EXPORT'}; + + my($denied) = grep {s/^&//; !$ok{$_}} @imports; + _not_exported($denied, $exporter, $file, $line) if $denied; + } + else { # We don't export anything. + _not_exported($imports[0], $exporter, $file, $line); + } + } + } + + _export($caller, $exporter, @imports); +} + + + +sub _export { + my($caller, $exporter, @imports) = @_; + + # Stole this from Exporter::Heavy. I'm sure it can be written better + # but I'm lazy at the moment. + foreach my $sym (@imports) { + # shortcut for the common case of no type character + (*{$caller.'::'.$sym} = \&{$exporter.'::'.$sym}, next) + unless $sym =~ s/^(\W)//; + + my $type = $1; + my $caller_sym = $caller.'::'.$sym; + my $export_sym = $exporter.'::'.$sym; + *{$caller_sym} = + $type eq '&' ? \&{$export_sym} : + $type eq '$' ? \${$export_sym} : + $type eq '@' ? \@{$export_sym} : + $type eq '%' ? \%{$export_sym} : + $type eq '*' ? *{$export_sym} : + do { require Carp; Carp::croak("Can't export symbol: $type$sym") }; + } +} + + +#"# +sub _not_exported { + my($thing, $exporter, $file, $line) = @_; + die sprintf qq|"%s" is not exported by the %s module at %s line %d\n|, + $thing, $exporter, $file, $line; +} + +1; + +__END__ + +=head1 NAME + +Exporter::Lite - Lightweight exporting of variables + +=head1 SYNOPSIS + + package Foo; + use Exporter::Lite; + + # Just like Exporter. + @EXPORT = qw($This That); + @EXPORT_OK = qw(@Left %Right); + + + # Meanwhile, in another piece of code! + package Bar; + use Foo; # exports $This and &That. + + +=head1 DESCRIPTION + +This is an alternative to Exporter intended to provide a lightweight +subset of its functionality. It supports C<import()>, C<@EXPORT> and +C<@EXPORT_OK> and not a whole lot else. + +Unlike Exporter, it is not necessary to inherit from Exporter::Lite +(ie. no C<@ISA = qw(Exporter::Lite)> mantra). Exporter::Lite simply +exports its import() function. This might be called a "mix-in". + +Setting up a module to export its variables and functions is simple: + + package My::Module; + use Exporter::Lite; + + @EXPORT = qw($Foo bar); + +now when you C<use My::Module>, C<$Foo> and C<bar()> will show up. + +In order to make exporting optional, use @EXPORT_OK. + + package My::Module; + use Exporter::Lite; + + @EXPORT_OK = qw($Foo bar); + +when My::Module is used, C<$Foo> and C<bar()> will I<not> show up. +You have to ask for them. C<use My::Module qw($Foo bar)>. + +=head1 Methods + +Export::Lite has one public method, import(), which is called +automaticly when your modules is use()'d. + +In normal usage you don't have to worry about this at all. + +=over 4 + +=item B<import> + + Some::Module->import; + Some::Module->import(@symbols); + +Works just like C<Exporter::import()> excepting it only honors +@Some::Module::EXPORT and @Some::Module::EXPORT_OK. + +The given @symbols are exported to the current package provided they +are in @Some::Module::EXPORT or @Some::Module::EXPORT_OK. Otherwise +an exception is thrown (ie. the program dies). + +If @symbols is not given, everything in @Some::Module::EXPORT is +exported. + +=back + +=head1 DIAGNOSTICS + +=over 4 + +=item '"%s" is not exported by the %s module' + +Attempted to import a symbol which is not in @EXPORT or @EXPORT_OK. + +=item 'Can\'t export symbol: %s' + +Attempted to import a symbol of an unknown type (ie. the leading $@% salad +wasn't recognized). + +=back + +=head1 BUGS and CAVEATS + +Its not yet clear if this is actually any lighter or faster than +Exporter. I know its at least on par. + +OTOH, the docs are much clearer and not having to say C<@ISA = +qw(Exporter)> is kinda nice. + +=head1 AUTHORS + +Michael G Schwern <schwern@pobox.com> + +=head1 LICENSE + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F<http://www.perl.com/perl/misc/Artistic.html> + +=head1 SEE ALSO + +L<Exporter>, L<Exporter::Simple>, L<UNIVERSAL::exports> + +=cut diff --git a/cpan/dist/Exporter-Lite/t/Exporter-Lite.t b/cpan/dist/Exporter-Lite/t/Exporter-Lite.t new file mode 100644 index 00000000..42e26272 --- /dev/null +++ b/cpan/dist/Exporter-Lite/t/Exporter-Lite.t @@ -0,0 +1,106 @@ +#!/usr/bin/perl -w + +use lib qw(t/lib); + +use Test::More tests => 30; + +BEGIN { use_ok('Exporter::Lite'); } +can_ok(__PACKAGE__, 'import'); + +{ + package Test1; + use Dummy; + + ::can_ok('Dummy', 'import'); + ::ok( defined &foo, '@EXPORT' ); + ::is( foo, 42, ' in one piece' ); + ::is( $foo, 'foofer', ' and variables' ); +} + +{ + package YATest1; + use Dummy qw(foo); + + ::ok( defined &foo, '@EXPORT with explicit request' ); + ::is( foo, 42, ' in one piece' ); +} + +{ + package Test2; + use Dummy (); + + ::ok( !defined &foo, 'import with ()' ); +} + +{ + package Test3; + eval { Dummy->import('car') }; + ::like( $@, '/"car" is not exported by the Dummy module/', + 'importing non-expoted function' ); +} + + +{ + package Test4; + use Dummy qw(bar); + ::ok( defined &bar, '@EXPORT_OK' ); + ::ok( !defined &foo, ' overrides @EXPORT' ); + ::ok( !defined &my_sum, ' only what we asked for from @EXPORT_OK' ); + ::is( bar, 23, ' not damaged in transport' ); +} + +{ + package YATest4; + use Dummy qw(bar $bar); + ::ok( defined &bar, '@EXPORT_OK' ); + ::ok( !defined &foo, ' overrides @EXPORT' ); + ::ok( !defined &my_sum, ' only what we asked for from @EXPORT_OK' ); + ::is( bar, 23, ' not damaged in transport' ); + ::is( $bar, 'barfer', ' $bar exported' ); +} + +{ + package Test5; + + my $warning = ''; + local $SIG{__WARN__} = sub { $warning = join '', @_ }; + eval 'use Dummy qw(bar)'; + eval 'use Dummy qw(&bar)'; + ::ok( defined &bar, 'importing multiple times' ); + ::is( $@, '', ' no errors' ); + ::is( $warning, '', ' no warnings' ); +} + +{ + package Test6; + + my $warning = ''; + local $SIG{__WARN__} = sub { $warning = join '', @_ }; + eval 'use Dummy qw(bar &bar bar bar &bar bar)'; + ::ok( defined &bar, 'importing duplicates' ); + ::is( $@, '', ' no errors' ); + ::is( $warning, '', ' no warnings' ); +} + +{ + package Test7; + use Dummy qw(my_sum bar foo); + + ::is( prototype("Dummy::my_sum"), '&@', 'imported sub has prototype' ); + ::is( prototype("my_sum"), '&@', ' prototype preserved' ); + + my @list = qw(1 2 3 4); + my $sum = my_sum { $_[0] + $_[1] } @list; + ::is( $sum, 10, ' and it works' ); +} + + +{ + package Test8; + eval "use Dummy 0.5"; + ::is( $@, '', 'use Foo VERSION' ); + + eval "use Dummy 99"; + ::like( $@, '/Dummy version 99.* required/', + 'use with version check' ); +} diff --git a/cpan/dist/Exporter-Lite/t/lib/Dummy.pm b/cpan/dist/Exporter-Lite/t/lib/Dummy.pm new file mode 100644 index 00000000..1c05cee0 --- /dev/null +++ b/cpan/dist/Exporter-Lite/t/lib/Dummy.pm @@ -0,0 +1,23 @@ +package Dummy; + +use Exporter::Lite; +@EXPORT = qw(&foo $foo); +@EXPORT_OK = qw(&bar my_sum $bar); +$VERSION = 0.5; + +$foo = 'foofer'; +sub foo { 42 } + +$bar = 'barfer'; +sub bar { 23 } + +sub my_sum (&@) { + my($sub, @list) = @_; + + foreach (@list) { $sum = $sub->($_, $sum || 0); } + return $sum; +} + +sub car { "yarblockos" } + +return 23; diff --git a/cpan/lib/Exporter/Lite.pm b/cpan/lib/Exporter/Lite.pm new file mode 100644 index 00000000..c7224876 --- /dev/null +++ b/cpan/lib/Exporter/Lite.pm @@ -0,0 +1,196 @@ +package Exporter::Lite; + +require 5.004; + +# Using strict or vars almost doubles our load time. Turn them back +# on when debugging. +#use strict 'vars'; # we're going to be doing a lot of sym refs +#use vars qw($VERSION @EXPORT); + +$VERSION = 0.02; +@EXPORT = qw(import); # we'll know pretty fast if it doesn't work :) + + + +sub import { + my($exporter, @imports) = @_; + my($caller, $file, $line) = caller; + + unless( @imports ) { # Default import. + @imports = @{$exporter.'::EXPORT'}; + } + else { + # Because @EXPORT_OK = () would indicate that nothing is + # to be exported, we cannot simply check the length of @EXPORT_OK. + # We must to oddness to see if the variable exists at all as + # well as avoid autovivification. + # XXX idea stolen from base.pm, this might be all unnecessary + my $eokglob; + if( $eokglob = ${$exporter.'::'}{EXPORT_OK} and *$eokglob{ARRAY} ) { + if( @{$exporter.'::EXPORT_OK'} ) { + # This can also be cached. + my %ok = map { s/^&//; $_ => 1 } @{$exporter.'::EXPORT_OK'}, + @{$exporter.'::EXPORT'}; + + my($denied) = grep {s/^&//; !$ok{$_}} @imports; + _not_exported($denied, $exporter, $file, $line) if $denied; + } + else { # We don't export anything. + _not_exported($imports[0], $exporter, $file, $line); + } + } + } + + _export($caller, $exporter, @imports); +} + + + +sub _export { + my($caller, $exporter, @imports) = @_; + + # Stole this from Exporter::Heavy. I'm sure it can be written better + # but I'm lazy at the moment. + foreach my $sym (@imports) { + # shortcut for the common case of no type character + (*{$caller.'::'.$sym} = \&{$exporter.'::'.$sym}, next) + unless $sym =~ s/^(\W)//; + + my $type = $1; + my $caller_sym = $caller.'::'.$sym; + my $export_sym = $exporter.'::'.$sym; + *{$caller_sym} = + $type eq '&' ? \&{$export_sym} : + $type eq '$' ? \${$export_sym} : + $type eq '@' ? \@{$export_sym} : + $type eq '%' ? \%{$export_sym} : + $type eq '*' ? *{$export_sym} : + do { require Carp; Carp::croak("Can't export symbol: $type$sym") }; + } +} + + +#"# +sub _not_exported { + my($thing, $exporter, $file, $line) = @_; + die sprintf qq|"%s" is not exported by the %s module at %s line %d\n|, + $thing, $exporter, $file, $line; +} + +1; + +__END__ + +=head1 NAME + +Exporter::Lite - Lightweight exporting of variables + +=head1 SYNOPSIS + + package Foo; + use Exporter::Lite; + + # Just like Exporter. + @EXPORT = qw($This That); + @EXPORT_OK = qw(@Left %Right); + + + # Meanwhile, in another piece of code! + package Bar; + use Foo; # exports $This and &That. + + +=head1 DESCRIPTION + +This is an alternative to Exporter intended to provide a lightweight +subset of its functionality. It supports C<import()>, C<@EXPORT> and +C<@EXPORT_OK> and not a whole lot else. + +Unlike Exporter, it is not necessary to inherit from Exporter::Lite +(ie. no C<@ISA = qw(Exporter::Lite)> mantra). Exporter::Lite simply +exports its import() function. This might be called a "mix-in". + +Setting up a module to export its variables and functions is simple: + + package My::Module; + use Exporter::Lite; + + @EXPORT = qw($Foo bar); + +now when you C<use My::Module>, C<$Foo> and C<bar()> will show up. + +In order to make exporting optional, use @EXPORT_OK. + + package My::Module; + use Exporter::Lite; + + @EXPORT_OK = qw($Foo bar); + +when My::Module is used, C<$Foo> and C<bar()> will I<not> show up. +You have to ask for them. C<use My::Module qw($Foo bar)>. + +=head1 Methods + +Export::Lite has one public method, import(), which is called +automaticly when your modules is use()'d. + +In normal usage you don't have to worry about this at all. + +=over 4 + +=item B<import> + + Some::Module->import; + Some::Module->import(@symbols); + +Works just like C<Exporter::import()> excepting it only honors +@Some::Module::EXPORT and @Some::Module::EXPORT_OK. + +The given @symbols are exported to the current package provided they +are in @Some::Module::EXPORT or @Some::Module::EXPORT_OK. Otherwise +an exception is thrown (ie. the program dies). + +If @symbols is not given, everything in @Some::Module::EXPORT is +exported. + +=back + +=head1 DIAGNOSTICS + +=over 4 + +=item '"%s" is not exported by the %s module' + +Attempted to import a symbol which is not in @EXPORT or @EXPORT_OK. + +=item 'Can\'t export symbol: %s' + +Attempted to import a symbol of an unknown type (ie. the leading $@% salad +wasn't recognized). + +=back + +=head1 BUGS and CAVEATS + +Its not yet clear if this is actually any lighter or faster than +Exporter. I know its at least on par. + +OTOH, the docs are much clearer and not having to say C<@ISA = +qw(Exporter)> is kinda nice. + +=head1 AUTHORS + +Michael G Schwern <schwern@pobox.com> + +=head1 LICENSE + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F<http://www.perl.com/perl/misc/Artistic.html> + +=head1 SEE ALSO + +L<Exporter>, L<Exporter::Simple>, L<UNIVERSAL::exports> + +=cut |
