r61340@onn: sartak | 2008-05-31 12:17:19 -0400
[p5sagit/Devel-REPL.git] / lib / Devel / REPL / Plugin / Packages.pm
1 package Devel::REPL::Plugin::Packages;
2 use Devel::REPL::Plugin;
3
4 use namespace::clean -except => [ "meta" ];
5
6 use vars qw($PKG_SAVE);
7
8 has 'current_package' => (
9   isa      => 'Str',
10   is       => 'rw',
11   default  => 'Devel::REPL::Plugin::Packages::DefaultScratchpad',
12   lazy     => 1
13 );
14
15 around 'wrap_as_sub' => sub {
16   my $orig = shift;
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}!;
21 };
22
23 around 'mangle_line' => sub {
24   my $orig = shift;
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__; }';
30   return $line;
31 };
32
33 after 'execute' => sub {
34   my ($self) = @_;
35   # if we survived execution successfully, save the new package out the global
36   $self->current_package($PKG_SAVE) if defined $PKG_SAVE;
37 };
38
39 around 'eval' => sub {
40   my $orig = shift;
41   my ($self, @args) = @_;
42   # localise the $PKG_SAVE global in case of nested evals
43   local $PKG_SAVE;
44   return $self->$orig(@args);
45 };
46
47 package Devel::REPL::Plugin::Packages::DefaultScratchpad;
48
49 # declare empty scratchpad package for cleanliness
50
51 1;
52
53 __END__
54
55 =head1 NAME
56
57 Devel::REPL::Plugin::Packages - Keep track of which package the user is in
58
59 =cut
60