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