This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Typos in *.p[lm]
[perl5.git] / lib / AutoLoader.pm
index 66c764f..4352d8b 100644 (file)
@@ -1,17 +1,21 @@
 package AutoLoader;
 
-use vars qw(@EXPORT @EXPORT_OK $VERSION);
+use strict;
+use 5.006_001;
+
+our($VERSION, $AUTOLOAD);
 
 my $is_dosish;
+my $is_epoc;
 my $is_vms;
+my $is_macos;
 
 BEGIN {
-    require Exporter;
-    @EXPORT = ();
-    @EXPORT_OK = qw(AUTOLOAD);
-    $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32';
+    $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare';
+    $is_epoc = $^O eq 'epoc';
     $is_vms = $^O eq 'VMS';
-    $VERSION = '5.56';
+    $is_macos = $^O eq 'MacOS';
+    $VERSION = '5.60';
 }
 
 AUTOLOAD {
@@ -35,7 +39,12 @@ AUTOLOAD {
        my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/);
        $pkg =~ s#::#/#g;
        if (defined($filename = $INC{"$pkg.pm"})) {
-           $filename =~ s#^(.*)$pkg\.pm$#$1auto/$pkg/$func.al#;
+           if ($is_macos) {
+               $pkg =~ tr#/#:#;
+               $filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s;
+           } else {
+               $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s;
+           }
 
            # if the file exists, then make sure that it is a
            # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al',
@@ -44,9 +53,18 @@ AUTOLOAD {
            # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib').
 
            if (-r $filename) {
-               unless ($filename =~ m|^/|) {
+               unless ($filename =~ m|^/|s) {
                    if ($is_dosish) {
-                       unless ($filename =~ m{^([a-z]:)?[\\/]}i) {
+                       unless ($filename =~ m{^([a-z]:)?[\\/]}is) {
+                            if ($^O ne 'NetWare') {
+                                       $filename = "./$filename";
+                               } else {
+                                       $filename = "$filename";
+                               }
+                       }
+                   }
+                   elsif ($is_epoc) {
+                       unless ($filename =~ m{^([a-z?]:)?[\\/]}is) {
                             $filename = "./$filename";
                        }
                    }
@@ -54,7 +72,7 @@ AUTOLOAD {
                        # XXX todo by VMSmiths
                        $filename = "./$filename";
                    }
-                   else {
+                   elsif (!$is_macos) {
                        $filename = "./$filename";
                    }
                }
@@ -70,25 +88,28 @@ AUTOLOAD {
        }
     }
     my $save = $@;
+    local $!; # Do not munge the value. 
     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;
@@ -103,7 +124,11 @@ sub import {
     # Export symbols, but not by accident of inheritance.
     #
 
-    Exporter::export $pkg, $callpkg, @_ if $pkg eq 'AutoLoader';
+    if ($pkg eq 'AutoLoader') {
+       no strict 'refs';
+       *{ $callpkg . '::AUTOLOAD' } = \&AUTOLOAD
+           if @_ and $_[0] =~ /^&?AUTOLOAD$/;
+    }
 
     #
     # Try to find the autosplit index file.  Eg., if the call package
@@ -121,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 ($@) {
@@ -136,6 +167,15 @@ sub import {
     } 
 }
 
+sub unimport {
+    my $callpkg = caller;
+
+    no strict 'refs';
+    my $symname = $callpkg . '::AUTOLOAD';
+    undef *{ $symname } if \&{ $symname } == \&AUTOLOAD;
+    *{ $symname } = \&{ $symname };
+}
+
 1;
 
 __END__
@@ -255,6 +295,12 @@ the package namespace.  Variables pre-declared with this pragma will be
 visible to any autoloaded routines (but will not be invisible outside
 the package, unfortunately).
 
+=head2 Not Using AutoLoader
+
+You can stop using AutoLoader by simply
+
+       no AutoLoader;
+
 =head2 B<AutoLoader> vs. B<SelfLoader>
 
 The B<AutoLoader> is similar in purpose to B<SelfLoader>: both delay the