Commit | Line | Data |
afe61f9c |
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; |