X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExporter.pm;h=2b860f384a88b86b0e686a565c309caaf638e69b;hb=7eb7d786de9bebe120f2143ce65237684a3a5d80;hp=a986fb33d3f411dd245751f69dd8a3197ddee0c4;hpb=6550321136bf6550564fabac12d7f206fc76aa5b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Exporter.pm b/lib/Exporter.pm index a986fb3..2b860f3 100644 --- a/lib/Exporter.pm +++ b/lib/Exporter.pm @@ -9,8 +9,10 @@ require 5.006; our $Debug = 0; our $ExportLevel = 0; our $Verbose ||= 0; -our $VERSION = '5.566'; -$Carp::Internal{Exporter} = 1; +our $VERSION = '5.59'; +our (%Cache); +# Carp does this now for us, so we can finally live w/o Carp +#$Carp::Internal{Exporter} = 1; sub as_heavy { require Exporter::Heavy; @@ -29,11 +31,16 @@ sub import { my $pkg = shift; my $callpkg = caller($ExportLevel); + if ($pkg eq "Exporter" and @_ and $_[0] eq "import") { + *{$callpkg."::import"} = \&import; + return; + } + # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-( - my($exports, $export_cache, $fail) - = (\@{"$pkg\::EXPORT"}, \%{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"}); + my($exports, $fail) = (\@{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"}); return export $pkg, $callpkg, @_ if $Verbose or $Debug or @$fail > 1; + my $export_cache = ($Cache{$pkg} ||= {}); my $args = @_ or @_ = @$exports; local $_; @@ -102,6 +109,12 @@ In module YourModule.pm: @ISA = qw(Exporter); @EXPORT_OK = qw(munge frobnicate); # symbols to export on request +or + + package YourModule; + use Exporter 'import'; # gives you Exporter's import() method directly + @EXPORT_OK = qw(munge frobnicate); # symbols to export on request + In other files which wish to use YourModule: use ModuleName qw(frobnicate); # import listed symbols @@ -200,9 +213,9 @@ need to know to use Exporter. =head2 Specialised Import Lists -If the first entry in an import list begins with !, : or / then the -list is treated as a series of specifications which either add to or -delete from the list of names to import. They are processed left to +If any of the entries in an import list begins with !, : or / then +the list is treated as a series of specifications which either add to +or delete from the list of names to import. They are processed left to right. Specifications are in the form: [!]name This name only @@ -247,7 +260,7 @@ Exporter has a special method, 'export_to_level' which is used in situations where you can't directly call Exporter's import method. The export_to_level method looks like: -MyPackage->export_to_level($where_to_export, $package, @what_to_export); + MyPackage->export_to_level($where_to_export, $package, @what_to_export); where $where_to_export is an integer telling how far up the calling stack to export your symbols, and @what_to_export is an array telling what @@ -257,37 +270,49 @@ currently unused. For example, suppose that you have a module, A, which already has an import function: -package A; + package A; -@ISA = qw(Exporter); -@EXPORT_OK = qw ($b); + @ISA = qw(Exporter); + @EXPORT_OK = qw ($b); -sub import -{ - $A::b = 1; # not a very useful import method -} + sub import + { + $A::b = 1; # not a very useful import method + } and you want to Export symbol $A::b back to the module that called package A. Since Exporter relies on the import method to work, via inheritance, as it stands Exporter::import() will never get called. Instead, say the following: -package A; -@ISA = qw(Exporter); -@EXPORT_OK = qw ($b); + package A; + @ISA = qw(Exporter); + @EXPORT_OK = qw ($b); -sub import -{ - $A::b = 1; - A->export_to_level(1, @_); -} + sub import + { + $A::b = 1; + A->export_to_level(1, @_); + } This will export the symbols one level 'above' the current package - ie: to the program or module that used package A. -Note: Be careful not to modify '@_' at all before you call export_to_level +Note: Be careful not to modify C<@_> at all before you call export_to_level - or people using your package will get very unexplained results! +=head2 Exporting without inheriting from Exporter + +By including Exporter in your @ISA you inherit an Exporter's import() method +but you also inherit several other helper methods which you probably don't +want. To avoid this you can do + + package YourModule; + use Exporter qw( import ); + +which will export Exporter's own import() method into YourModule. +Everything will work as before but you won't need to include Exporter in +@YourModule::ISA. =head2 Module Version Checking