3a6db51851ed9c1bc44070433964c1a9ab3b4e92
[p5sagit/Devel-REPL.git] / lib / Devel / REPL.pm
1 package Devel::REPL;
2
3 use Term::ReadLine;
4 use Moose;
5 use namespace::clean;
6
7 with 'MooseX::Object::Pluggable';
8
9 has 'term' => (
10   is => 'rw', required => 1,
11   default => sub { Term::ReadLine->new('Perl REPL') }
12 );
13
14 has 'prompt' => (
15   is => 'rw', required => 1,
16   default => sub { '$ ' }
17 );
18
19 has 'out_fh' => (
20   is => 'rw', required => 1, lazy => 1,
21   default => sub { shift->term->OUT || \*STDOUT; }
22 );
23
24 sub run {
25   my ($self) = @_;
26   while ($self->run_once) {
27     # keep looping
28   }
29 }
30
31 sub run_once {
32   my ($self) = @_;
33   my $line = $self->read;
34   return unless defined($line); # undefined value == EOF
35   my @ret = $self->execute($line);
36   $self->print(@ret);
37   return 1;
38 }
39
40 sub read {
41   my ($self) = @_;
42   return $self->term->readline($self->prompt);
43 }
44
45 sub execute {
46   my ($self, $to_exec) = @_;
47   my @ret = eval $to_exec;
48   @ret = ("ERROR: $@") if $@;
49   return @ret;
50 }
51
52 sub print {
53   my ($self, @ret) = @_;
54   my $fh = $self->out_fh;
55   print $fh "@ret";
56 }
57
58 1;