X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2FDevel-REPL.git;a=blobdiff_plain;f=lib%2FDevel%2FREPL.pm;h=3752fd40076c5dc0fbce8cc92ce8e053bce7c728;hp=3a6db51851ed9c1bc44070433964c1a9ab3b4e92;hb=950232b2d6e2398c5f804c58e2bedf1e98fd7151;hpb=afe61f9c1991af3ae964bd2e34056a0b4e50ff13 diff --git a/lib/Devel/REPL.pm b/lib/Devel/REPL.pm index 3a6db51..3752fd4 100644 --- a/lib/Devel/REPL.pm +++ b/lib/Devel/REPL.pm @@ -2,7 +2,10 @@ package Devel::REPL; use Term::ReadLine; use Moose; -use namespace::clean; +use namespace::clean -except => [ 'meta' ]; +use 5.8.1; # might work with earlier perls but probably not + +our $VERSION = '1.001000'; # 1.1.0 with 'MooseX::Object::Pluggable'; @@ -32,7 +35,7 @@ sub run_once { my ($self) = @_; my $line = $self->read; return unless defined($line); # undefined value == EOF - my @ret = $self->execute($line); + my @ret = $self->eval($line); $self->print(@ret); return 1; } @@ -42,17 +45,72 @@ sub read { return $self->term->readline($self->prompt); } +sub eval { + my ($self, $line) = @_; + my ($to_exec, @rest) = $self->compile($line); + return @rest unless defined($to_exec); + my @ret = $self->execute($to_exec); + return @ret; +} + +sub compile { + my $_REPL = shift; + my $compiled = eval $_REPL->wrap_as_sub($_[0]); + return (undef, $_REPL->error_return("Compile error", $@)) if $@; + return $compiled; +} + +sub wrap_as_sub { + my ($self, $line) = @_; + return qq!sub {\n!.$self->mangle_line($line).qq!\n}\n!; +} + +sub mangle_line { + my ($self, $line) = @_; + return $line; +} + sub execute { - my ($self, $to_exec) = @_; - my @ret = eval $to_exec; - @ret = ("ERROR: $@") if $@; + my ($self, $to_exec, @args) = @_; + my @ret = eval { $to_exec->(@args) }; + return $self->error_return("Runtime error", $@) if $@; return @ret; } +sub error_return { + my ($self, $type, $error) = @_; + return "${type}: ${error}"; +} + sub print { my ($self, @ret) = @_; my $fh = $self->out_fh; + no warnings 'uninitialized'; print $fh "@ret"; } +=head1 NAME + +Devel::REPL - a modern perl interactive shell + +=head1 SYNOPSIS + + my $repl = Devel::REPL->new; + $repl->load_plugin($_) for qw(History LexEnv); + $repl->run + +Alternatively, use the 're.pl' script installed with the distribution + + system$ re.pl + +=head1 AUTHOR + +Matt S Trout - mst (at) shadowcatsystems.co.uk (L) + +=head1 LICENSE + +This library is free software under the same terms as perl itself + +=cut + 1;