| Filter-EOF documentation | Contained in the Filter-EOF distribution. |
Filter::EOF - Run a callback after a file has been compiled
0.04
package MyPackage;
use warnings;
use strict;
use Filter::EOF;
sub import {
my ($class, @args) = @_;
my $caller = scalar caller;
# set the COMPILE_TIME package var to a false value
# when the file was compiled
Filter::EOF->on_eof_call(sub {
no strict 'refs';
${ $caller . '::COMPILE_TIME' } = 0;
});
# set the COMPILE_TIME package var to a true value when
# we start compiling it.
{ no strict 'refs';
${ $caller . '::COMPILE_TIME' } = 1;
}
}
1;
...
package MyUsingPackage;
use warnings;
use strict;
our $COMPILE_TIME;
use MyPackage;
# prints 'yes'
BEGIN { print +( $COMPILE_TIME ? 'yes' : 'no' ), "\n" }
# prints 'no'
print +( $COMPILE_TIME ? 'yes' : 'no' ), "\n";
1;
This module utilises Perl's source filters to provide you with a mechanism to run some code after a file using your module has been processed.
import( @functions )Currently, only a function equivalent of the on_eof_call method
is provided for export.
use Filter::EOF qw( on_eof_call );
sub import {
my ($class) = @_;
...
on_eof_call { ... };
}
...
on_eof_call( $code_ref )Call this method in your own import method to register a code
reference that should be called when the file useing yours was
compiled.
The code reference will get a scalar reference as first argument to an empty string. if you change this string to something else, it will be appended at the end of the source.
# call C<some_function()> after runtime.
Filter->on_eof_call(sub {
my $append = shift;
$$append .= '; some_function(); 1;';
});
You can optionally import the on_eof_call function into your namespace.
You can find the example mentioned in SYNOPSIS in the distribution
directory examples/synopsis/.
Filter::Call::Util, Exporting without using Exporter's import method in Exporter
Robert 'phaylon' Sedlacek - <rs@474.at>. Many thanks to
Matt S Trout for the idea and inspirations on this module.
This program is free software; you can redistribute it and/or modify it under the same terms as perl itself.
| Filter-EOF documentation | Contained in the Filter-EOF distribution. |
package Filter::EOF;
use warnings; use strict;
our $VERSION = 0.04;
use Carp; use Filter::Util::Call;
my %Export = ( on_eof_call => sub { my $class = shift; sub (&) { $class->on_eof_call(@_) } }, ); sub import { my ($class, @names) = @_; for my $name (@names) { Carp::croak "Unknown function '$name'" unless exists $Export{ $name }; no strict 'refs'; *{ scalar(caller) . '::' . $name } = $Export{ $name }->($class); } return 1; }
sub on_eof_call { my ($class, $code) = @_; my $past_eof; filter_add( sub { my $status = filter_read; return $status if $past_eof; if ($status == 0) { $code->(\$_); $status = 1; $past_eof = 1; } return $status; }); }
1;