add LexEnv plugin, rename $REPL to $_REPL to avoid clash with Lexical::Persistence
[p5sagit/Devel-REPL.git] / lib / Devel / REPL / Plugin / LexEnv.pm
diff --git a/lib/Devel/REPL/Plugin/LexEnv.pm b/lib/Devel/REPL/Plugin/LexEnv.pm
new file mode 100644 (file)
index 0000000..f78fb01
--- /dev/null
@@ -0,0 +1,30 @@
+package Devel::REPL::Plugin::LexEnv;
+
+use Moose::Role;
+use namespace::clean -except => [ 'meta' ];
+use Lexical::Persistence;
+
+has 'lexical_environment' => (
+  isa => 'Lexical::Persistence',
+  is => 'rw',
+  required => 1,
+  lazy => 1,
+  default => sub { Lexical::Persistence->new }
+);
+
+around 'mangle_line' => sub {
+  my $orig = shift;
+  my ($self, @rest) = @_;
+  my $line = $self->$orig(@rest);
+  my $lp = $self->lexical_environment;
+  return join('', map { "my $_;\n" } keys %{$lp->get_context('_')}).$line;
+};
+
+around 'execute' => sub {
+  my $orig = shift;
+  my ($self, $to_exec, @rest) = @_;
+  my $wrapped = $self->lexical_environment->wrap($to_exec);
+  return $self->$orig($wrapped, @rest);
+};
+
+1;