--- /dev/null
+use strict;
+use warnings;
+
+package B::Hooks::EndOfScope;
+# ABSTRACT: Execute code after a scope finished compilation
+
+use 5.008000;
+use Variable::Magic 0.34;
+
+use Sub::Exporter -setup => {
+ exports => ['on_scope_end'],
+ groups => { default => ['on_scope_end'] },
+};
+
+
+=head1 SYNOPSIS
+
+ on_scope_end { ... };
+
+=head1 DESCRIPTION
+
+This module allows you to execute code when perl finished compiling the
+surrounding scope.
+
+=func on_scope_end
+
+ on_scope_end { ... };
+
+ on_scope_end $code;
+
+Registers C<$code> to be executed after the surrounding scope has been
+compiled.
+
+This is exported by default. See L<Sub::Exporter> on how to customize it.
+
+=cut
+
+{
+ my $wiz = Variable::Magic::wizard
+ data => sub { [$_[1]] },
+ free => sub { $_->() for @{ $_[1] }; () };
+
+ sub on_scope_end (&) {
+ my $cb = shift;
+
+ $^H |= 0x020000;
+
+ if (my $stack = Variable::Magic::getdata %^H, $wiz) {
+ push @{ $stack }, $cb;
+ }
+ else {
+ Variable::Magic::cast %^H, $wiz, $cb;
+ }
+ }
+}
+
+=head1 SEE ALSO
+
+L<Sub::Exporter>
+
+L<Variable::Magic>
+
+=cut
+
+1;
--- /dev/null
+use strict;
+use warnings;
+use Test::More tests => 6;
+
+BEGIN { use_ok('B::Hooks::EndOfScope') }
+
+BEGIN {
+ ok(exists &on_scope_end, 'on_scope_end imported');
+ is(prototype('on_scope_end'), '&', '.. and has the right prototype');
+}
+
+our ($i, $called);
+
+BEGIN { $i = 0 }
+
+sub foo {
+ BEGIN {
+ on_scope_end { $called = 1; $i = 42 };
+ on_scope_end { $i = 1 };
+ };
+
+ is($i, 1, 'value still set at runtime');
+}
+
+BEGIN {
+ ok($called, 'first callback invoked');
+ is($i, 1, '.. but the second is invoked later')
+}
+
+foo();
--- /dev/null
+use strict;
+use warnings;
+use Test::More tests => 1;
+
+use B::Hooks::EndOfScope;
+
+our $called;
+
+sub foo {
+ BEGIN { on_scope_end { $called = 1 } }
+
+ # uncomment this to make the test pass
+ eval '42';
+}
+
+BEGIN {
+ ok($called, 'callback invoked');
+}
--- /dev/null
+use strict;
+use warnings;
+use Test::More tests => 2;
+
+use B::Hooks::EndOfScope;
+
+eval q[
+ sub foo {
+ BEGIN {
+ on_scope_end { die 'bar' };
+ }
+ }
+];
+
+like($@, qr/^bar/);
+pass('no segfault');