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