Leaner exporter
Ilya Zakharevich [Mon, 31 Dec 2001 18:16:08 +0000 (13:16 -0500)]
Message-Id: <20011231181608.A29253@math.ohio-state.edu>

p4raw-id: //depot/perl@13996

ext/B/t/stash.t
lib/Exporter.pm
lib/Exporter/Heavy.pm

index e0ac3e9..0a32a18 100755 (executable)
@@ -38,7 +38,7 @@ $a =~ s/-uNetWare,// if $^O eq 'NetWare';
 $a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
 $a =~ s/-uCwd,// if $^O eq 'cygwin';
   $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uaccess,-uattributes,'
-     . '-umain,-ustrict,-uutf8,-uwarnings';
+     . '-umain,-uutf8,-uwarnings';
 if ($Is_VMS) {
     $a =~ s/-uFile,-uFile::Copy,//;
     $a =~ s/-uVMS,-uVMS::Filespec,//;
index 0001089..61dcd0c 100644 (file)
@@ -2,33 +2,27 @@ package Exporter;
 
 require 5.006;
 
-use strict;
-no strict 'refs';
+# Be lean.
+#use strict;
+#no strict 'refs';
 
 our $Debug = 0;
 our $ExportLevel = 0;
 our $Verbose ||= 0;
-our $VERSION = '5.565';
+our $VERSION = '5.566';
 $Carp::Internal{Exporter} = 1;
 
-sub export_to_level {
+sub as_heavy {
   require Exporter::Heavy;
-  goto &Exporter::Heavy::heavy_export_to_level;
+  # Unfortunately, this does not work if the caller is aliased as *name = \&foo
+  # Thus the need to create a lot of identical subroutines
+  my $c = (caller(1))[3];
+  $c =~ s/.*:://;
+  \&{"Exporter::Heavy::heavy_$c"};
 }
 
 sub export {
-  require Exporter::Heavy;
-  goto &Exporter::Heavy::heavy_export;
-}
-
-sub export_tags {
-  require Exporter::Heavy;
-  Exporter::Heavy::_push_tags((caller)[0], "EXPORT",    \@_);
-}
-
-sub export_ok_tags {
-  require Exporter::Heavy;
-  Exporter::Heavy::_push_tags((caller)[0], "EXPORT_OK", \@_);
+  goto &{as_heavy()};
 }
 
 sub import {
@@ -65,7 +59,6 @@ sub import {
   *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_;
 }
 
-
 # Default methods
 
 sub export_fail {
@@ -73,12 +66,25 @@ sub export_fail {
     @_;
 }
 
+# Unfortunately, caller(1)[3] "does not work" if the caller is aliased as
+# *name = \&foo.  Thus the need to create a lot of identical subroutines
+# Otherwise we could have aliased them to export().
 
-sub require_version {
-    require Exporter::Heavy;
-    goto &Exporter::Heavy::require_version;
+sub export_to_level {
+  goto &{as_heavy()};
+}
+
+sub export_tags {
+  goto &{as_heavy()};
 }
 
+sub export_ok_tags {
+  goto &{as_heavy()};
+}
+
+sub require_version {
+  goto &{as_heavy()};
+}
 
 1;
 __END__
index d1c4a10..3bdc4b4 100644 (file)
@@ -215,11 +215,18 @@ sub _push_tags {
     }
 }
 
-
-sub require_version {
+sub heavy_require_version {
     my($self, $wanted) = @_;
     my $pkg = ref $self || $self;
     return ${pkg}->VERSION($wanted);
 }
 
+sub heavy_export_tags {
+  _push_tags((caller)[0], "EXPORT",    \@_);
+}
+
+sub heavy_export_ok_tags {
+  _push_tags((caller)[0], "EXPORT_OK", \@_);
+}
+
 1;