Added Plugin/NewlineHack, simple plugin to print a newline after output
[p5sagit/Devel-REPL.git] / lib / Devel / REPL / Plugin / History.pm
CommitLineData
80fa249c 1package Devel::REPL::Plugin::History;
2
3use Moose::Role;
4
5has 'history' => (
6 isa => 'ArrayRef', is => 'rw', required => 1, lazy => 1,
7 default => sub { [] }
8);
9
10sub push_history {
11 my ($self, $line) = @_;
12 push(@{$self->history}, $line);
13}
14
15around 'read' => sub {
16 my $orig = shift;
17 my ($self, @args) = @_;
18 my $line = $self->$orig(@args);
19 if (defined $line) {
20 if ($line =~ m/^!(.*)$/) {
21 my $call = $1;
22 $line = $self->history_call($call);
23 if (defined $line) {
24 $self->print($line."\n");
25 } else {
26 return "'Unable to find ${call} in history'";
27 }
28 }
29 if ($line =~ m/\S/) {
30 $self->push_history($line);
31 }
32 }
33 return $line;
34};
35
36sub history_call {
37 my ($self, $call) = @_;
38 if ($call =~ m/^(-?\d+)$/) { # handle !1 or !-1
39 my $idx = $1;
40 $idx-- if ($idx > 0); # !1 gets history element 0
41 my $line = $self->history->[$idx];
42 return $line;
43 }
44 my $re = qr/^\Q${call}\E/;
45 foreach my $line (reverse @{$self->history}) {
46 return $line if ($line =~ $re);
47 }
48 return;
49};
50
511;