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