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