RE: [PATCH] -I and MakeMaker again
[p5sagit/p5-mst-13.2.git] / lib / AutoLoader.pm
CommitLineData
8990e307 1package AutoLoader;
21c92a1d 2
17f410f9 3use 5.005_64;
4our(@EXPORT, @EXPORT_OK, $VERSION);
f06db76b 5
adaafad2 6my $is_dosish;
ed79a026 7my $is_epoc;
adaafad2 8my $is_vms;
084592ab 9my $is_macos;
adaafad2 10
1be0b951 11BEGIN {
12 require Exporter;
e3d0cac0 13 @EXPORT = @EXPORT = ();
14 @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD);
2986a63f 15 $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare';
ed79a026 16 $is_epoc = $^O eq 'epoc';
adaafad2 17 $is_vms = $^O eq 'VMS';
084592ab 18 $is_macos = $^O eq 'MacOS';
19 $VERSION = '5.58';
1be0b951 20}
f06db76b 21
8990e307 22AUTOLOAD {
7d4fbd98 23 my $sub = $AUTOLOAD;
24 my $filename;
5a556d17 25 # Braces used to preserve $1 et al.
26 {
adaafad2 27 # Try to find the autoloaded file from the package-qualified
28 # name of the sub. e.g., if the sub needed is
29 # Getopt::Long::GetOptions(), then $INC{Getopt/Long.pm} is
30 # something like '/usr/lib/perl5/Getopt/Long.pm', and the
31 # autoload file is '/usr/lib/perl5/auto/Getopt/Long/GetOptions.al'.
32 #
33 # However, if @INC is a relative path, this might not work. If,
34 # for example, @INC = ('lib'), then $INC{Getopt/Long.pm} is
35 # 'lib/Getopt/Long.pm', and we want to require
36 # 'auto/Getopt/Long/GetOptions.al' (without the leading 'lib').
37 # In this case, we simple prepend the 'auto/' and let the
38 # C<require> take care of the searching for us.
39
7d4fbd98 40 my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/);
adaafad2 41 $pkg =~ s#::#/#g;
7d4fbd98 42 if (defined($filename = $INC{"$pkg.pm"})) {
084592ab 43 if ($is_macos) {
44 $pkg =~ tr#/#:#;
45 $filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s;
46 } else {
47 $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s;
48 }
adaafad2 49
50 # if the file exists, then make sure that it is a
51 # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al',
52 # or './lib/auto/foo/bar.al'. This avoids C<require> searching
53 # (and failing) to find the 'lib/auto/foo/bar.al' because it
54 # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib').
55
7d4fbd98 56 if (-r $filename) {
14a089c5 57 unless ($filename =~ m|^/|s) {
adaafad2 58 if ($is_dosish) {
14a089c5 59 unless ($filename =~ m{^([a-z]:)?[\\/]}is) {
2986a63f 60 if ($^O ne 'NetWare') {
61 $filename = "./$filename";
62 } else {
63 $filename = "$filename";
64 }
adaafad2 65 }
66 }
ed79a026 67 elsif ($is_epoc) {
68 unless ($filename =~ m{^([a-z?]:)?[\\/]}is) {
69 $filename = "./$filename";
70 }
71 }elsif ($is_vms) {
7d4fbd98 72 # XXX todo by VMSmiths
73 $filename = "./$filename";
adaafad2 74 }
084592ab 75 elsif (!$is_macos) {
7d4fbd98 76 $filename = "./$filename";
adaafad2 77 }
78 }
79 }
80 else {
7d4fbd98 81 $filename = undef;
adaafad2 82 }
83 }
7d4fbd98 84 unless (defined $filename) {
adaafad2 85 # let C<require> do the searching
7d4fbd98 86 $filename = "auto/$sub.al";
87 $filename =~ s#::#/#g;
adaafad2 88 }
5a556d17 89 }
e14baed2 90 my $save = $@;
212caf55 91 local $!; # Do not munge the value.
7d4fbd98 92 eval { local $SIG{__DIE__}; require $filename };
8990e307 93 if ($@) {
7d4fbd98 94 if (substr($sub,-9) eq '::DESTROY') {
95 *$sub = sub {};
e14baed2 96 } else {
97 # The load might just have failed because the filename was too
98 # long for some old SVR3 systems which treat long names as errors.
99 # If we can succesfully truncate a long name then it's worth a go.
100 # There is a slight risk that we could pick up the wrong file here
101 # but autosplit should have warned about that when splitting.
7d4fbd98 102 if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
103 eval { local $SIG{__DIE__}; require $filename };
e14baed2 104 }
105 if ($@){
106 $@ =~ s/ at .*\n//;
fb73857a 107 my $error = $@;
108 require Carp;
109 Carp::croak($error);
e14baed2 110 }
a0d0e21e 111 }
8990e307 112 }
e14baed2 113 $@ = $save;
7d4fbd98 114 goto &$sub;
8990e307 115}
1be0b951 116
c2960299 117sub import {
1be0b951 118 my $pkg = shift;
119 my $callpkg = caller;
120
121 #
122 # Export symbols, but not by accident of inheritance.
123 #
124
e3d0cac0 125 if ($pkg eq 'AutoLoader') {
126 local $Exporter::ExportLevel = 1;
127 Exporter::import $pkg, @_;
128 }
1be0b951 129
130 #
c2960299 131 # Try to find the autosplit index file. Eg., if the call package
132 # is POSIX, then $INC{POSIX.pm} is something like
133 # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in
134 # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that.
135 #
136 # However, if @INC is a relative path, this might not work. If,
137 # for example, @INC = ('lib'), then
138 # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require
139 # 'auto/POSIX/autosplit.ix' (without the leading 'lib').
140 #
1be0b951 141
1c1c7f20 142 (my $calldir = $callpkg) =~ s#::#/#g;
1be0b951 143 my $path = $INC{$calldir . '.pm'};
144 if (defined($path)) {
c2960299 145 # Try absolute path name.
1be0b951 146 $path =~ s#^(.*)$calldir\.pm$#$1auto/$calldir/autosplit.ix#;
c2960299 147 eval { require $path; };
148 # If that failed, try relative path with normal @INC searching.
149 if ($@) {
1be0b951 150 $path ="auto/$calldir/autosplit.ix";
c2960299 151 eval { require $path; };
152 }
fb73857a 153 if ($@) {
154 my $error = $@;
155 require Carp;
156 Carp::carp($error);
157 }
f06db76b 158 }
f06db76b 159}
8990e307 160
cb0cff20 161sub unimport {
162 my $callpkg = caller;
163 eval "package $callpkg; sub AUTOLOAD;";
164}
165
8990e307 1661;
1be0b951 167
168__END__
169
170=head1 NAME
171
172AutoLoader - load subroutines only on demand
173
174=head1 SYNOPSIS
175
176 package Foo;
177 use AutoLoader 'AUTOLOAD'; # import the default AUTOLOAD subroutine
178
179 package Bar;
180 use AutoLoader; # don't import AUTOLOAD, define our own
181 sub AUTOLOAD {
182 ...
183 $AutoLoader::AUTOLOAD = "...";
184 goto &AutoLoader::AUTOLOAD;
185 }
186
187=head1 DESCRIPTION
188
189The B<AutoLoader> module works with the B<AutoSplit> module and the
190C<__END__> token to defer the loading of some subroutines until they are
191used rather than loading them all at once.
192
193To use B<AutoLoader>, the author of a module has to place the
194definitions of subroutines to be autoloaded after an C<__END__> token.
195(See L<perldata>.) The B<AutoSplit> module can then be run manually to
196extract the definitions into individual files F<auto/funcname.al>.
197
198B<AutoLoader> implements an AUTOLOAD subroutine. When an undefined
199subroutine in is called in a client module of B<AutoLoader>,
200B<AutoLoader>'s AUTOLOAD subroutine attempts to locate the subroutine in a
201file with a name related to the location of the file from which the
202client module was read. As an example, if F<POSIX.pm> is located in
203F</usr/local/lib/perl5/POSIX.pm>, B<AutoLoader> will look for perl
204subroutines B<POSIX> in F</usr/local/lib/perl5/auto/POSIX/*.al>, where
205the C<.al> file has the same name as the subroutine, sans package. If
206such a file exists, AUTOLOAD will read and evaluate it,
207thus (presumably) defining the needed subroutine. AUTOLOAD will then
208C<goto> the newly defined subroutine.
209
f610777f 210Once this process completes for a given function, it is defined, so
1be0b951 211future calls to the subroutine will bypass the AUTOLOAD mechanism.
212
213=head2 Subroutine Stubs
214
215In order for object method lookup and/or prototype checking to operate
216correctly even when methods have not yet been defined it is necessary to
217"forward declare" each subroutine (as in C<sub NAME;>). See
218L<perlsub/"SYNOPSIS">. Such forward declaration creates "subroutine
219stubs", which are place holders with no code.
220
221The AutoSplit and B<AutoLoader> modules automate the creation of forward
222declarations. The AutoSplit module creates an 'index' file containing
223forward declarations of all the AutoSplit subroutines. When the
224AutoLoader module is 'use'd it loads these declarations into its callers
225package.
226
227Because of this mechanism it is important that B<AutoLoader> is always
228C<use>d and not C<require>d.
229
230=head2 Using B<AutoLoader>'s AUTOLOAD Subroutine
231
232In order to use B<AutoLoader>'s AUTOLOAD subroutine you I<must>
233explicitly import it:
234
235 use AutoLoader 'AUTOLOAD';
236
237=head2 Overriding B<AutoLoader>'s AUTOLOAD Subroutine
238
239Some modules, mainly extensions, provide their own AUTOLOAD subroutines.
240They typically need to check for some special cases (such as constants)
241and then fallback to B<AutoLoader>'s AUTOLOAD for the rest.
242
243Such modules should I<not> import B<AutoLoader>'s AUTOLOAD subroutine.
244Instead, they should define their own AUTOLOAD subroutines along these
245lines:
246
247 use AutoLoader;
fb73857a 248 use Carp;
1be0b951 249
250 sub AUTOLOAD {
7d4fbd98 251 my $sub = $AUTOLOAD;
252 (my $constname = $sub) =~ s/.*:://;
1be0b951 253 my $val = constant($constname, @_ ? $_[0] : 0);
254 if ($! != 0) {
265f5c4a 255 if ($! =~ /Invalid/ || $!{EINVAL}) {
7d4fbd98 256 $AutoLoader::AUTOLOAD = $sub;
1be0b951 257 goto &AutoLoader::AUTOLOAD;
258 }
259 else {
260 croak "Your vendor has not defined constant $constname";
261 }
262 }
7d4fbd98 263 *$sub = sub { $val }; # same as: eval "sub $sub { $val }";
264 goto &$sub;
1be0b951 265 }
266
267If any module's own AUTOLOAD subroutine has no need to fallback to the
268AutoLoader's AUTOLOAD subroutine (because it doesn't have any AutoSplit
269subroutines), then that module should not use B<AutoLoader> at all.
270
271=head2 Package Lexicals
272
273Package lexicals declared with C<my> in the main block of a package
274using B<AutoLoader> will not be visible to auto-loaded subroutines, due to
275the fact that the given scope ends at the C<__END__> marker. A module
276using such variables as package globals will not work properly under the
277B<AutoLoader>.
278
279The C<vars> pragma (see L<perlmod/"vars">) may be used in such
280situations as an alternative to explicitly qualifying all globals with
281the package namespace. Variables pre-declared with this pragma will be
282visible to any autoloaded routines (but will not be invisible outside
283the package, unfortunately).
284
cb0cff20 285=head2 Not Using AutoLoader
286
287You can stop using AutoLoader by simply
288
289 no AutoLoader;
290
1be0b951 291=head2 B<AutoLoader> vs. B<SelfLoader>
292
293The B<AutoLoader> is similar in purpose to B<SelfLoader>: both delay the
294loading of subroutines.
295
296B<SelfLoader> uses the C<__DATA__> marker rather than C<__END__>.
297While this avoids the use of a hierarchy of disk files and the
298associated open/close for each routine loaded, B<SelfLoader> suffers a
299startup speed disadvantage in the one-time parsing of the lines after
300C<__DATA__>, after which routines are cached. B<SelfLoader> can also
301handle multiple packages in a file.
302
303B<AutoLoader> only reads code as it is requested, and in many cases
f610777f 304should be faster, but requires a mechanism like B<AutoSplit> be used to
1be0b951 305create the individual files. L<ExtUtils::MakeMaker> will invoke
306B<AutoSplit> automatically if B<AutoLoader> is used in a module source
307file.
308
309=head1 CAVEATS
310
311AutoLoaders prior to Perl 5.002 had a slightly different interface. Any
312old modules which use B<AutoLoader> should be changed to the new calling
313style. Typically this just means changing a require to a use, adding
314the explicit C<'AUTOLOAD'> import if needed, and removing B<AutoLoader>
315from C<@ISA>.
316
317On systems with restrictions on file name length, the file corresponding
318to a subroutine may have a shorter name that the routine itself. This
319can lead to conflicting file names. The I<AutoSplit> package warns of
320these potential conflicts when used to split a module.
321
adaafad2 322AutoLoader may fail to find the autosplit files (or even find the wrong
323ones) in cases where C<@INC> contains relative paths, B<and> the program
324does C<chdir>.
325
1be0b951 326=head1 SEE ALSO
327
328L<SelfLoader> - an autoloader that doesn't use external files.
329
330=cut