Zero entries were skipped, fix from Adrian Goalby
[p5sagit/p5-mst-13.2.git] / lib / SelfLoader.pm
CommitLineData
f8881bd9 1package SelfLoader;
e3d0cac0 2# use Carp;
f8881bd9 3require Exporter;
4@ISA = qw(Exporter);
5@EXPORT = qw(AUTOLOAD);
bfdd1499 6$VERSION = "1.0902";
52128c7b 7sub Version {$VERSION}
f8881bd9 8$DEBUG = 0;
9
10my %Cache; # private cache for all SelfLoader's client packages
11
09bef843 12# allow checking for valid ': attrlist' attachments
13my $nested;
14455d6c 14$nested = qr{ \( (?: (?> [^()]+ ) | (??{ $nested }) )* \) }x;
0120eecf 15my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
09bef843 16my $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
17
e3d0cac0 18sub croak { require Carp; goto &Carp::croak }
19
f8881bd9 20AUTOLOAD {
21 print STDERR "SelfLoader::AUTOLOAD for $AUTOLOAD\n" if $DEBUG;
c7675058 22 my $SL_code = $Cache{$AUTOLOAD};
bfdd1499 23 my $save = $@; # evals in both AUTOLOAD and _load_stubs can corrupt $@
c7675058 24 unless ($SL_code) {
f8881bd9 25 # Maybe this pack had stubs before __DATA__, and never initialized.
26 # Or, this maybe an automatic DESTROY method call when none exists.
27 $AUTOLOAD =~ m/^(.*)::/;
28 SelfLoader->_load_stubs($1) unless exists $Cache{"${1}::<DATA"};
c7675058 29 $SL_code = $Cache{$AUTOLOAD};
30 $SL_code = "sub $AUTOLOAD { }"
31 if (!$SL_code and $AUTOLOAD =~ m/::DESTROY$/);
32 croak "Undefined subroutine $AUTOLOAD" unless $SL_code;
f8881bd9 33 }
c7675058 34 print STDERR "SelfLoader::AUTOLOAD eval: $SL_code\n" if $DEBUG;
bfdd1499 35
c7675058 36 eval $SL_code;
f8881bd9 37 if ($@) {
38 $@ =~ s/ at .*\n//;
39 croak $@;
40 }
bfdd1499 41 $@ = $save;
f8881bd9 42 defined(&$AUTOLOAD) || die "SelfLoader inconsistency error";
43 delete $Cache{$AUTOLOAD};
44 goto &$AUTOLOAD
45}
46
47sub load_stubs { shift->_load_stubs((caller)[0]) }
48
49sub _load_stubs {
50 my($self, $callpack) = @_;
51 my $fh = \*{"${callpack}::DATA"};
52 my $currpack = $callpack;
53 my($line,$name,@lines, @stubs, $protoype);
54
55 print STDERR "SelfLoader::load_stubs($callpack)\n" if $DEBUG;
56 croak("$callpack doesn't contain an __DATA__ token")
57 unless fileno($fh);
58 $Cache{"${currpack}::<DATA"} = 1; # indicate package is cached
59
52128c7b 60 local($/) = "\n";
40da2db3 61 while(defined($line = <$fh>) and $line !~ m/^__END__/) {
09bef843 62 if ($line =~ m/^sub\s+([\w:]+)\s*((?:\([\\\$\@\%\&\*\;]*\))?(?:$attr_list)?)/) {
f8881bd9 63 push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
64 $protoype = $2;
65 @lines = ($line);
66 if (index($1,'::') == -1) { # simple sub name
67 $name = "${currpack}::$1";
68 } else { # sub name with package
69 $name = $1;
70 $name =~ m/^(.*)::/;
71 if (defined(&{"${1}::AUTOLOAD"})) {
72 \&{"${1}::AUTOLOAD"} == \&SelfLoader::AUTOLOAD ||
73 die 'SelfLoader Error: attempt to specify Selfloading',
74 " sub $name in non-selfloading module $1";
75 } else {
76 $self->export($1,'AUTOLOAD');
77 }
78 }
79 } elsif ($line =~ m/^package\s+([\w:]+)/) { # A package declared
80 push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
81 $self->_package_defined($line);
82 $name = '';
83 @lines = ();
84 $currpack = $1;
85 $Cache{"${currpack}::<DATA"} = 1; # indicate package is cached
86 if (defined(&{"${1}::AUTOLOAD"})) {
87 \&{"${1}::AUTOLOAD"} == \&SelfLoader::AUTOLOAD ||
88 die 'SelfLoader Error: attempt to specify Selfloading',
89 " package $currpack which already has AUTOLOAD";
90 } else {
91 $self->export($currpack,'AUTOLOAD');
92 }
93 } else {
94 push(@lines,$line);
95 }
96 }
97 close($fh) unless defined($line) && $line =~ /^__END__\s*DATA/; # __END__
98 push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
99 eval join('', @stubs) if @stubs;
100}
101
102
103sub _add_to_cache {
104 my($self,$fullname,$pack,$lines, $protoype) = @_;
105 return () unless $fullname;
e3d0cac0 106 (require Carp), Carp::carp("Redefining sub $fullname")
107 if exists $Cache{$fullname};
f8881bd9 108 $Cache{$fullname} = join('', "package $pack; ",@$lines);
109 print STDERR "SelfLoader cached $fullname: $Cache{$fullname}" if $DEBUG;
110 # return stub to be eval'd
111 defined($protoype) ? "sub $fullname $protoype;" : "sub $fullname;"
112}
113
114sub _package_defined {}
115
1161;
117__END__
cb1a09d0 118
f8881bd9 119=head1 NAME
120
121SelfLoader - load functions only on demand
122
123=head1 SYNOPSIS
124
125 package FOOBAR;
126 use SelfLoader;
3cb6de81 127
f8881bd9 128 ... (initializing code)
3cb6de81 129
f8881bd9 130 __DATA__
131 sub {....
132
133
134=head1 DESCRIPTION
135
136This module tells its users that functions in the FOOBAR package are to be
463e8aa9 137autoloaded from after the C<__DATA__> token. See also
138L<perlsub/"Autoloading">.
f8881bd9 139
140=head2 The __DATA__ token
141
463e8aa9 142The C<__DATA__> token tells the perl compiler that the perl code
143for compilation is finished. Everything after the C<__DATA__> token
f8881bd9 144is available for reading via the filehandle FOOBAR::DATA,
463e8aa9 145where FOOBAR is the name of the current package when the C<__DATA__>
146token is reached. This works just the same as C<__END__> does in
147package 'main', but for other modules data after C<__END__> is not
f610777f 148automatically retrievable, whereas data after C<__DATA__> is.
463e8aa9 149The C<__DATA__> token is not recognized in versions of perl prior to
f8881bd9 1505.001m.
151
463e8aa9 152Note that it is possible to have C<__DATA__> tokens in the same package
153in multiple files, and that the last C<__DATA__> token in a given
f8881bd9 154package that is encountered by the compiler is the one accessible
463e8aa9 155by the filehandle. This also applies to C<__END__> and main, i.e. if
156the 'main' program has an C<__END__>, but a module 'require'd (_not_ 'use'd)
157by that program has a 'package main;' declaration followed by an 'C<__DATA__>',
158then the C<DATA> filehandle is set to access the data after the C<__DATA__>
159in the module, _not_ the data after the C<__END__> token in the 'main'
f8881bd9 160program, since the compiler encounters the 'require'd file later.
161
162=head2 SelfLoader autoloading
163
463e8aa9 164The B<SelfLoader> works by the user placing the C<__DATA__>
165token I<after> perl code which needs to be compiled and
166run at 'require' time, but I<before> subroutine declarations
f8881bd9 167that can be loaded in later - usually because they may never
168be called.
169
463e8aa9 170The B<SelfLoader> will read from the FOOBAR::DATA filehandle to
171load in the data after C<__DATA__>, and load in any subroutine
f8881bd9 172when it is called. The costs are the one-time parsing of the
463e8aa9 173data after C<__DATA__>, and a load delay for the _first_
f8881bd9 174call of any autoloaded function. The benefits (hopefully)
175are a speeded up compilation phase, with no need to load
176functions which are never used.
177
463e8aa9 178The B<SelfLoader> will stop reading from C<__DATA__> if
179it encounters the C<__END__> token - just as you would expect.
180If the C<__END__> token is present, and is followed by the
181token DATA, then the B<SelfLoader> leaves the FOOBAR::DATA
f8881bd9 182filehandle open on the line after that token.
183
463e8aa9 184The B<SelfLoader> exports the C<AUTOLOAD> subroutine to the
185package using the B<SelfLoader>, and this loads the called
f8881bd9 186subroutine when it is first called.
187
188There is no advantage to putting subroutines which will _always_
463e8aa9 189be called after the C<__DATA__> token.
f8881bd9 190
191=head2 Autoloading and package lexicals
192
193A 'my $pack_lexical' statement makes the variable $pack_lexical
463e8aa9 194local _only_ to the file up to the C<__DATA__> token. Subroutines
f8881bd9 195declared elsewhere _cannot_ see these types of variables,
196just as if you declared subroutines in the package but in another
197file, they cannot see these variables.
198
199So specifically, autoloaded functions cannot see package
463e8aa9 200lexicals (this applies to both the B<SelfLoader> and the Autoloader).
201The C<vars> pragma provides an alternative to defining package-level
202globals that will be visible to autoloaded routines. See the documentation
203on B<vars> in the pragma section of L<perlmod>.
f8881bd9 204
205=head2 SelfLoader and AutoLoader
206
463e8aa9 207The B<SelfLoader> can replace the AutoLoader - just change 'use AutoLoader'
208to 'use SelfLoader' (though note that the B<SelfLoader> exports
f8881bd9 209the AUTOLOAD function - but if you have your own AUTOLOAD and
210are using the AutoLoader too, you probably know what you're doing),
463e8aa9 211and the C<__END__> token to C<__DATA__>. You will need perl version 5.001m
f8881bd9 212or later to use this (version 5.001 with all patches up to patch m).
213
463e8aa9 214There is no need to inherit from the B<SelfLoader>.
f8881bd9 215
463e8aa9 216The B<SelfLoader> works similarly to the AutoLoader, but picks up the
217subs from after the C<__DATA__> instead of in the 'lib/auto' directory.
f610777f 218There is a maintenance gain in not needing to run AutoSplit on the module
f8881bd9 219at installation, and a runtime gain in not needing to keep opening and
220closing files to load subs. There is a runtime loss in needing
463e8aa9 221to parse the code after the C<__DATA__>. Details of the B<AutoLoader> and
222another view of these distinctions can be found in that module's
223documentation.
f8881bd9 224
225=head2 __DATA__, __END__, and the FOOBAR::DATA filehandle.
226
227This section is only relevant if you want to use
463e8aa9 228the C<FOOBAR::DATA> together with the B<SelfLoader>.
229
230Data after the C<__DATA__> token in a module is read using the
231FOOBAR::DATA filehandle. C<__END__> can still be used to denote the end
232of the C<__DATA__> section if followed by the token DATA - this is supported
233by the B<SelfLoader>. The C<FOOBAR::DATA> filehandle is left open if an
234C<__END__> followed by a DATA is found, with the filehandle positioned at
235the start of the line after the C<__END__> token. If no C<__END__> token is
236present, or an C<__END__> token with no DATA token on the same line, then
237the filehandle is closed.
238
239The B<SelfLoader> reads from wherever the current
240position of the C<FOOBAR::DATA> filehandle is, until the
241EOF or C<__END__>. This means that if you want to use
f8881bd9 242that filehandle (and ONLY if you want to), you should either
243
2441. Put all your subroutine declarations immediately after
463e8aa9 245the C<__DATA__> token and put your own data after those
246declarations, using the C<__END__> token to mark the end
247of subroutine declarations. You must also ensure that the B<SelfLoader>
1fef88e7 248reads first by calling 'SelfLoader-E<gt>load_stubs();', or by using a
f8881bd9 249function which is selfloaded;
250
251or
252
463e8aa9 2532. You should read the C<FOOBAR::DATA> filehandle first, leaving
f8881bd9 254the handle open and positioned at the first line of subroutine
255declarations.
256
257You could conceivably do both.
258
259=head2 Classes and inherited methods.
260
261For modules which are not classes, this section is not relevant.
262This section is only relevant if you have methods which could
263be inherited.
264
265A subroutine stub (or forward declaration) looks like
266
267 sub stub;
268
269i.e. it is a subroutine declaration without the body of the
270subroutine. For modules which are not classes, there is no real
271need for stubs as far as autoloading is concerned.
272
273For modules which ARE classes, and need to handle inherited methods,
274stubs are needed to ensure that the method inheritance mechanism works
275properly. You can load the stubs into the module at 'require' time, by
1fef88e7 276adding the statement 'SelfLoader-E<gt>load_stubs();' to the module to do
f8881bd9 277this.
278
463e8aa9 279The alternative is to put the stubs in before the C<__DATA__> token BEFORE
280releasing the module, and for this purpose the C<Devel::SelfStubber>
f8881bd9 281module is available. However this does require the extra step of ensuring
282that the stubs are in the module. If this is done I strongly recommend
283that this is done BEFORE releasing the module - it should NOT be done
284at install time in general.
285
286=head1 Multiple packages and fully qualified subroutine names
287
288Subroutines in multiple packages within the same file are supported - but you
463e8aa9 289should note that this requires exporting the C<SelfLoader::AUTOLOAD> to
f8881bd9 290every package which requires it. This is done automatically by the
463e8aa9 291B<SelfLoader> when it first loads the subs into the cache, but you should
292really specify it in the initialization before the C<__DATA__> by putting
f8881bd9 293a 'use SelfLoader' statement in each package.
294
295Fully qualified subroutine names are also supported. For example,
296
297 __DATA__
298 sub foo::bar {23}
299 package baz;
300 sub dob {32}
301
463e8aa9 302will all be loaded correctly by the B<SelfLoader>, and the B<SelfLoader>
f8881bd9 303will ensure that the packages 'foo' and 'baz' correctly have the
463e8aa9 304B<SelfLoader> C<AUTOLOAD> method when the data after C<__DATA__> is first
305parsed.
f8881bd9 306
307=cut