[REPATCH lib/AutoLoader.pm] Remove Dependency on Exporter (take 2 or 3)
[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 {
170 my $callpkg = caller;
171 eval "package $callpkg; sub AUTOLOAD;";
172}
173
8990e307 1741;
1be0b951 175
176__END__
177
178=head1 NAME
179
180AutoLoader - load subroutines only on demand
181
182=head1 SYNOPSIS
183
184 package Foo;
185 use AutoLoader 'AUTOLOAD'; # import the default AUTOLOAD subroutine
186
187 package Bar;
188 use AutoLoader; # don't import AUTOLOAD, define our own
189 sub AUTOLOAD {
190 ...
191 $AutoLoader::AUTOLOAD = "...";
192 goto &AutoLoader::AUTOLOAD;
193 }
194
195=head1 DESCRIPTION
196
197The B<AutoLoader> module works with the B<AutoSplit> module and the
198C<__END__> token to defer the loading of some subroutines until they are
199used rather than loading them all at once.
200
201To use B<AutoLoader>, the author of a module has to place the
202definitions of subroutines to be autoloaded after an C<__END__> token.
203(See L<perldata>.) The B<AutoSplit> module can then be run manually to
204extract the definitions into individual files F<auto/funcname.al>.
205
206B<AutoLoader> implements an AUTOLOAD subroutine. When an undefined
207subroutine in is called in a client module of B<AutoLoader>,
208B<AutoLoader>'s AUTOLOAD subroutine attempts to locate the subroutine in a
209file with a name related to the location of the file from which the
210client module was read. As an example, if F<POSIX.pm> is located in
211F</usr/local/lib/perl5/POSIX.pm>, B<AutoLoader> will look for perl
212subroutines B<POSIX> in F</usr/local/lib/perl5/auto/POSIX/*.al>, where
213the C<.al> file has the same name as the subroutine, sans package. If
214such a file exists, AUTOLOAD will read and evaluate it,
215thus (presumably) defining the needed subroutine. AUTOLOAD will then
216C<goto> the newly defined subroutine.
217
f610777f 218Once this process completes for a given function, it is defined, so
1be0b951 219future calls to the subroutine will bypass the AUTOLOAD mechanism.
220
221=head2 Subroutine Stubs
222
223In order for object method lookup and/or prototype checking to operate
224correctly even when methods have not yet been defined it is necessary to
225"forward declare" each subroutine (as in C<sub NAME;>). See
226L<perlsub/"SYNOPSIS">. Such forward declaration creates "subroutine
227stubs", which are place holders with no code.
228
229The AutoSplit and B<AutoLoader> modules automate the creation of forward
230declarations. The AutoSplit module creates an 'index' file containing
231forward declarations of all the AutoSplit subroutines. When the
232AutoLoader module is 'use'd it loads these declarations into its callers
233package.
234
235Because of this mechanism it is important that B<AutoLoader> is always
236C<use>d and not C<require>d.
237
238=head2 Using B<AutoLoader>'s AUTOLOAD Subroutine
239
240In order to use B<AutoLoader>'s AUTOLOAD subroutine you I<must>
241explicitly import it:
242
243 use AutoLoader 'AUTOLOAD';
244
245=head2 Overriding B<AutoLoader>'s AUTOLOAD Subroutine
246
247Some modules, mainly extensions, provide their own AUTOLOAD subroutines.
248They typically need to check for some special cases (such as constants)
249and then fallback to B<AutoLoader>'s AUTOLOAD for the rest.
250
251Such modules should I<not> import B<AutoLoader>'s AUTOLOAD subroutine.
252Instead, they should define their own AUTOLOAD subroutines along these
253lines:
254
255 use AutoLoader;
fb73857a 256 use Carp;
1be0b951 257
258 sub AUTOLOAD {
7d4fbd98 259 my $sub = $AUTOLOAD;
260 (my $constname = $sub) =~ s/.*:://;
1be0b951 261 my $val = constant($constname, @_ ? $_[0] : 0);
262 if ($! != 0) {
265f5c4a 263 if ($! =~ /Invalid/ || $!{EINVAL}) {
7d4fbd98 264 $AutoLoader::AUTOLOAD = $sub;
1be0b951 265 goto &AutoLoader::AUTOLOAD;
266 }
267 else {
268 croak "Your vendor has not defined constant $constname";
269 }
270 }
7d4fbd98 271 *$sub = sub { $val }; # same as: eval "sub $sub { $val }";
272 goto &$sub;
1be0b951 273 }
274
275If any module's own AUTOLOAD subroutine has no need to fallback to the
276AutoLoader's AUTOLOAD subroutine (because it doesn't have any AutoSplit
277subroutines), then that module should not use B<AutoLoader> at all.
278
279=head2 Package Lexicals
280
281Package lexicals declared with C<my> in the main block of a package
282using B<AutoLoader> will not be visible to auto-loaded subroutines, due to
283the fact that the given scope ends at the C<__END__> marker. A module
284using such variables as package globals will not work properly under the
285B<AutoLoader>.
286
287The C<vars> pragma (see L<perlmod/"vars">) may be used in such
288situations as an alternative to explicitly qualifying all globals with
289the package namespace. Variables pre-declared with this pragma will be
290visible to any autoloaded routines (but will not be invisible outside
291the package, unfortunately).
292
cb0cff20 293=head2 Not Using AutoLoader
294
295You can stop using AutoLoader by simply
296
297 no AutoLoader;
298
1be0b951 299=head2 B<AutoLoader> vs. B<SelfLoader>
300
301The B<AutoLoader> is similar in purpose to B<SelfLoader>: both delay the
302loading of subroutines.
303
304B<SelfLoader> uses the C<__DATA__> marker rather than C<__END__>.
305While this avoids the use of a hierarchy of disk files and the
306associated open/close for each routine loaded, B<SelfLoader> suffers a
307startup speed disadvantage in the one-time parsing of the lines after
308C<__DATA__>, after which routines are cached. B<SelfLoader> can also
309handle multiple packages in a file.
310
311B<AutoLoader> only reads code as it is requested, and in many cases
f610777f 312should be faster, but requires a mechanism like B<AutoSplit> be used to
1be0b951 313create the individual files. L<ExtUtils::MakeMaker> will invoke
314B<AutoSplit> automatically if B<AutoLoader> is used in a module source
315file.
316
317=head1 CAVEATS
318
319AutoLoaders prior to Perl 5.002 had a slightly different interface. Any
320old modules which use B<AutoLoader> should be changed to the new calling
321style. Typically this just means changing a require to a use, adding
322the explicit C<'AUTOLOAD'> import if needed, and removing B<AutoLoader>
323from C<@ISA>.
324
325On systems with restrictions on file name length, the file corresponding
326to a subroutine may have a shorter name that the routine itself. This
327can lead to conflicting file names. The I<AutoSplit> package warns of
328these potential conflicts when used to split a module.
329
adaafad2 330AutoLoader may fail to find the autosplit files (or even find the wrong
331ones) in cases where C<@INC> contains relative paths, B<and> the program
332does C<chdir>.
333
1be0b951 334=head1 SEE ALSO
335
336L<SelfLoader> - an autoloader that doesn't use external files.
337
338=cut