Implement C<use Exporter 'import'> :
Fergal Daly [Mon, 10 Nov 2003 00:08:52 +0000 (00:08 +0000)]
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

lib/Exporter.pm
lib/Exporter.t

index 753ea6a..176f6b8 100644 (file)
@@ -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
 
index 5415068..548613d 100644 (file)
@@ -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");
+