X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExporter.pm;h=2b860f384a88b86b0e686a565c309caaf638e69b;hb=6a93515622cf0655623a39a9eaff82a4b9b3268b;hp=8b8d4c49392bedc9c959ec99c0b3ad2ebb5d8138;hpb=cec46e5aa4a3941270ece36999adfbf3f58eb538;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Exporter.pm b/lib/Exporter.pm index 8b8d4c4..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 @@ -285,9 +298,21 @@ Instead, say the following: 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