}
sub compile {
- my $REPL = shift;
- my $compiled = eval $REPL->wrap_as_sub($_[0]);
- return (undef, $REPL->error_return("Compile error", $@)) if $@;
+ my $_REPL = shift;
+ my $compiled = eval $_REPL->wrap_as_sub($_[0]);
+ return (undef, $_REPL->error_return("Compile error", $@)) if $@;
return $compiled;
}
--- /dev/null
+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;
my $next = shift;
my ($self, $line) = @_;
if ($line =~ /^#(.*)/) {
- return $next->($self, ('$REPL->' . $1 . '; return();'));
+ return $next->($self, ('$_REPL->' . $1 . '; return();'));
}
else {
return $next->($self, $line);