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