perl 5.002beta1h patch: Configure
[p5sagit/p5-mst-13.2.git] / lib / AutoLoader.pm
1 package AutoLoader;
2 use Carp;
3
4 =head1 NAME
5
6 AutoLoader - load functions only on demand
7
8 =head1 SYNOPSIS
9
10     package FOOBAR;
11     use Exporter;
12     use AutoLoader;
13     @ISA = (Exporter, AutoLoader);
14
15 =head1 DESCRIPTION
16
17 This module tells its users that functions in the FOOBAR package are to be
18 autoloaded from F<auto/$AUTOLOAD.al>.  See L<perlsub/"Autoloading">.
19
20 =cut
21
22 AUTOLOAD {
23     my $name = "auto/$AUTOLOAD.al";
24     $name =~ s#::#/#g;
25     eval {require $name};
26     if ($@) {
27         # The load might just have failed because the filename was too
28         # long for some old SVR3 systems which treat long names as errors.
29         # If we can succesfully truncate a long name then it's worth a go.
30         # There is a slight risk that we could pick up the wrong file here
31         # but autosplit should have warned about that when splitting.
32         if ($name =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
33             eval {require $name};
34         }
35         elsif ($AUTOLOAD =~ /::DESTROY$/) {
36             # eval "sub $AUTOLOAD {}";
37             *$AUTOLOAD = sub {};
38         }
39         if ($@){
40             $@ =~ s/ at .*\n//;
41             croak $@;
42         }
43     }
44     goto &$AUTOLOAD;
45 }
46                             
47 sub import {
48     my ($callclass, $callfile, $callline,$path,$callpack) = caller(0);
49     ($callpack = $callclass) =~ s#::#/#;
50     # Try to find the autosplit index file.  Eg., if the call package
51     # is POSIX, then $INC{POSIX.pm} is something like
52     # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in
53     # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that.
54     #
55     # However, if @INC is a relative path, this might not work.  If,
56     # for example, @INC = ('lib'), then
57     # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require
58     # 'auto/POSIX/autosplit.ix' (without the leading 'lib').
59     #
60     if (defined($path = $INC{$callpack . '.pm'})) {
61         # Try absolute path name.
62         $path =~ s#^(.*)$callpack\.pm$#$1auto/$callpack/autosplit.ix#;
63         eval { require $path; };
64         # If that failed, try relative path with normal @INC searching.
65         if ($@) {
66             $path ="auto/$callpack/autosplit.ix";
67             eval { require $path; };
68         }
69         carp $@ if ($@);  
70     } 
71 }
72
73 1;