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