1 package Devel::REPL::Plugin::Packages;
2 use Devel::REPL::Plugin;
4 use namespace::clean -except => [ "meta" ];
6 use vars qw($PKG_SAVE);
8 has 'current_package' => (
11 default => 'Devel::REPL::Plugin::Packages::DefaultScratchpad',
15 around 'wrap_as_sub' => sub {
17 my ($self, @args) = @_;
18 my $line = $self->$orig(@args);
19 # prepend package def before sub { ... }
20 return q!package !.$self->current_package.qq!;\n${line}!;
23 around 'mangle_line' => sub {
25 my ($self, @args) = @_;
26 my $line = $self->$orig(@args);
27 # add a BEGIN block to set the package around at the end of the sub
28 # without mangling the return value (we save it off into a global)
29 $line .= '; BEGIN { $Devel::REPL::Plugin::Packages::PKG_SAVE = __PACKAGE__; }';
33 after 'execute' => sub {
35 # if we survived execution successfully, save the new package out the global
36 $self->current_package($PKG_SAVE) if defined $PKG_SAVE;
39 around 'eval' => sub {
41 my ($self, @args) = @_;
42 # localise the $PKG_SAVE global in case of nested evals
44 return $self->$orig(@args);
47 package Devel::REPL::Plugin::Packages::DefaultScratchpad;
49 # declare empty scratchpad package for cleanliness
57 Devel::REPL::Plugin::Packages - Keep track of which package the user is in