b38915872c7adbf562d27b0d40d251d57bf13ff8
[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         }
38         if ($@){
39             $@ =~ s/ at .*\n//;
40             croak $@;
41         }
42     }
43     goto &$AUTOLOAD;
44 }
45                             
46 sub import {
47     my ($callclass, $callfile, $callline,$path,$callpack) = caller(0);
48     ($callpack = $callclass) =~ s#::#/#;
49     # Try to find the autosplit index file.  Eg., if the call package
50     # is POSIX, then $INC{POSIX.pm} is something like
51     # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in
52     # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that.
53     #
54     # However, if @INC is a relative path, this might not work.  If,
55     # for example, @INC = ('lib'), then
56     # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require
57     # 'auto/POSIX/autosplit.ix' (without the leading 'lib').
58     #
59     if (defined($path = $INC{$callpack . '.pm'})) {
60         # Try absolute path name.
61         $path =~ s#^(.*)$callpack\.pm$#$1auto/$callpack/autosplit.ix#;
62         eval { require $path; };
63         # If that failed, try relative path with normal @INC searching.
64         if ($@) {
65             $path ="auto/$callpack/autosplit.ix";
66             eval { require $path; };
67         }
68         carp $@ if ($@);  
69     } 
70 }
71
72 1;