X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FAutoLoader.pm;h=4352d8b1fbe1a46cc27ec718f8154ff26a4058c8;hb=9a66ea416324d5cd1459c59e545b38c9c889fdaa;hp=10d13ba10c382d8dd8a8b951642de81364e9cb5f;hpb=212caf55b8a7ec0d131ccbf5f587aaed741446df;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/AutoLoader.pm b/lib/AutoLoader.pm index 10d13ba..4352d8b 100644 --- a/lib/AutoLoader.pm +++ b/lib/AutoLoader.pm @@ -1,7 +1,9 @@ package AutoLoader; -use 5.005_64; -our(@EXPORT, @EXPORT_OK, $VERSION); +use strict; +use 5.006_001; + +our($VERSION, $AUTOLOAD); my $is_dosish; my $is_epoc; @@ -9,14 +11,11 @@ my $is_vms; my $is_macos; BEGIN { - require Exporter; - @EXPORT = @EXPORT = (); - @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD); $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare'; $is_epoc = $^O eq 'epoc'; $is_vms = $^O eq 'VMS'; $is_macos = $^O eq 'MacOS'; - $VERSION = '5.58'; + $VERSION = '5.60'; } AUTOLOAD { @@ -68,7 +67,8 @@ AUTOLOAD { unless ($filename =~ m{^([a-z?]:)?[\\/]}is) { $filename = "./$filename"; } - }elsif ($is_vms) { + } + elsif ($is_vms) { # XXX todo by VMSmiths $filename = "./$filename"; } @@ -92,22 +92,24 @@ AUTOLOAD { eval { local $SIG{__DIE__}; require $filename }; if ($@) { if (substr($sub,-9) eq '::DESTROY') { + no strict 'refs'; *$sub = sub {}; - } else { + $@ = undef; + } elsif ($@ =~ /^Can't locate/) { # The load might just have failed because the filename was too # long for some old SVR3 systems which treat long names as errors. - # If we can succesfully truncate a long name then it's worth a go. + # If we can successfully truncate a long name then it's worth a go. # There is a slight risk that we could pick up the wrong file here # but autosplit should have warned about that when splitting. if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){ eval { local $SIG{__DIE__}; require $filename }; } - if ($@){ - $@ =~ s/ at .*\n//; - my $error = $@; - require Carp; - Carp::croak($error); - } + } + if ($@){ + $@ =~ s/ at .*\n//; + my $error = $@; + require Carp; + Carp::croak($error); } } $@ = $save; @@ -123,8 +125,9 @@ sub import { # if ($pkg eq 'AutoLoader') { - local $Exporter::ExportLevel = 1; - Exporter::import $pkg, @_; + no strict 'refs'; + *{ $callpkg . '::AUTOLOAD' } = \&AUTOLOAD + if @_ and $_[0] =~ /^&?AUTOLOAD$/; } # @@ -143,7 +146,13 @@ sub import { my $path = $INC{$calldir . '.pm'}; if (defined($path)) { # Try absolute path name. - $path =~ s#^(.*)$calldir\.pm$#$1auto/$calldir/autosplit.ix#; + if ($is_macos) { + (my $malldir = $calldir) =~ tr#/#:#; + $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:autosplit.ix#s; + } else { + $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/autosplit.ix#; + } + eval { require $path; }; # If that failed, try relative path with normal @INC searching. if ($@) { @@ -159,8 +168,12 @@ sub import { } sub unimport { - my $callpkg = caller; - eval "package $callpkg; sub AUTOLOAD;"; + my $callpkg = caller; + + no strict 'refs'; + my $symname = $callpkg . '::AUTOLOAD'; + undef *{ $symname } if \&{ $symname } == \&AUTOLOAD; + *{ $symname } = \&{ $symname }; } 1;