B-Hooks-AtRuntime
view release on metacpan or search on metacpan
lib/B/Hooks/AtRuntime.pm view on Meta::CPAN
# code) is the level of @Hooks to clear.
my @Hooks;
sub replace_hooks {
my ($new) = @_;
# By deleting the stash entry we ensure the only ref to the glob is
# through the optree it was compiled into. This means that if that
# optree is ever freed, the glob will disappear along with anything
# closed over by the user's callbacks.
delete $B::Hooks::AtRuntime::{hooks};
no strict "refs";
$new and *{"hooks"} = $new;
}
sub clear {
my ($depth) = @_;
$Hooks[$depth] = undef;
replace_hooks $Hooks[$depth - 1];
lib/B/Hooks/AtRuntime.pm view on Meta::CPAN
sub find_hooks {
USE_FILTER and compiling_string_eval() and croak
"Can't use at_runtime from a string eval";
my $depth = count_BEGINs()
or croak "You must call at_runtime at compile time";
my $hk;
unless ($hk = $Hooks[$depth]) {
# Close over an array of callbacks so we don't need to keep
# stuffing text into the buffer.
my @hooks;
$hk = $Hooks[$depth] = \@hooks;
replace_hooks $hk;
# This must be all on one line, so we don't mess up perl's idea
# of the current line number.
lex_stuff(q{B::Hooks::AtRuntime::run(@B::Hooks::AtRuntime::hooks);} .
"BEGIN{B::Hooks::AtRuntime::clear($depth)}");
}
( run in 2.626 seconds using v1.01-cache-2.11-cpan-9b1e4054eb1 )