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