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