From: Fergal Daly Date: Mon, 10 Nov 2003 00:08:52 +0000 (+0000) Subject: Implement C : X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=fe43f860c5d2e34a3ae8a9320e2ba4f6b396ff1e;p=p5sagit%2Fp5-mst-13.2.git Implement C : Subject: Re: [PATCH] Exporter-related PODs Message-Id: <200311100008.52639.fergal@esatclear.ie> (tweaked, so the imported import() doesn't spit out warnings) p4raw-id: //depot/perl@21798 --- diff --git a/lib/Exporter.pm b/lib/Exporter.pm index 753ea6a..176f6b8 100644 --- a/lib/Exporter.pm +++ b/lib/Exporter.pm @@ -9,7 +9,7 @@ require 5.006; our $Debug = 0; our $ExportLevel = 0; our $Verbose ||= 0; -our $VERSION = '5.567'; +our $VERSION = '5.57'; our (%Cache); $Carp::Internal{Exporter} = 1; @@ -30,6 +30,11 @@ 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, $fail) = (\@{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"}); return export $pkg, $callpkg, @_ @@ -103,6 +108,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 @@ -286,9 +297,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 diff --git a/lib/Exporter.t b/lib/Exporter.t index 5415068..548613d 100644 --- a/lib/Exporter.t +++ b/lib/Exporter.t @@ -21,7 +21,7 @@ sub ok ($;$) { } -print "1..26\n"; +print "1..28\n"; require Exporter; ok( 1, 'Exporter compiled' ); @@ -196,3 +196,21 @@ push @Moving::Target::EXPORT_OK, 'bar'; Moving::Target->import (bar); ::ok (bar eq "bar", "imported bar after EXPORT_OK changed"); + +package The::Import; + +use Exporter 'import'; + +eval { import() }; +::ok(\&import == \&Exporter::import, "imported the import routine"); + +@EXPORT = qw( wibble ); +sub wibble {return "wobble"}; + +package Use::The::Import; + +The::Import->import; + +my $val = eval { wibble() }; +::ok($val eq "wobble", "exported importer worked"); +