| 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
|
|---|