Undo Tim's tainting patch from beta1h.
[p5sagit/p5-mst-13.2.git] / lib / AutoLoader.pm
CommitLineData
8990e307 1package AutoLoader;
a0d0e21e 2use Carp;
8990e307 3
f06db76b 4=head1 NAME
5
6AutoLoader - 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
17This module tells its users that functions in the FOOBAR package are to be
18autoloaded from F<auto/$AUTOLOAD.al>. See L<perlsub/"Autoloading">.
19
20=cut
21
8990e307 22AUTOLOAD {
7c366566 23 my $name = "auto/$AUTOLOAD.al";
8990e307 24 $name =~ s#::#/#g;
25 eval {require $name};
26 if ($@) {
a0d0e21e 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 }
748a9306 35 elsif ($AUTOLOAD =~ /::DESTROY$/) {
4633a7c4 36 # eval "sub $AUTOLOAD {}";
37 *$AUTOLOAD = sub {};
748a9306 38 }
a0d0e21e 39 if ($@){
40 $@ =~ s/ at .*\n//;
41 croak $@;
42 }
8990e307 43 }
5b930e62 44 $DB::sub = $AUTOLOAD; # Now debugger know where we are.
8990e307 45 goto &$AUTOLOAD;
46}
f06db76b 47
c2960299 48sub import {
49 my ($callclass, $callfile, $callline,$path,$callpack) = caller(0);
50 ($callpack = $callclass) =~ s#::#/#;
51 # Try to find the autosplit index file. Eg., if the call package
52 # is POSIX, then $INC{POSIX.pm} is something like
53 # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in
54 # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that.
55 #
56 # However, if @INC is a relative path, this might not work. If,
57 # for example, @INC = ('lib'), then
58 # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require
59 # 'auto/POSIX/autosplit.ix' (without the leading 'lib').
60 #
61 if (defined($path = $INC{$callpack . '.pm'})) {
62 # Try absolute path name.
63 $path =~ s#^(.*)$callpack\.pm$#$1auto/$callpack/autosplit.ix#;
64 eval { require $path; };
65 # If that failed, try relative path with normal @INC searching.
66 if ($@) {
67 $path ="auto/$callpack/autosplit.ix";
68 eval { require $path; };
69 }
70 carp $@ if ($@);
f06db76b 71 }
f06db76b 72}
8990e307 73
741;