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