From: Sartak Date: Thu, 29 Nov 2007 01:45:53 +0000 (+0000) Subject: Add the OutputCache plugin, which stores the most recent result in _ X-Git-Tag: v1.003015~140 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=cf51843c3f3c45256998f34c54b22e910cbb8828;p=p5sagit%2FDevel-REPL.git Add the OutputCache plugin, which stores the most recent result in _ git-svn-id: http://dev.catalyst.perl.org/repos/bast/trunk/Devel-REPL@3895 bd8105ee-0ff8-0310-8827-fb3f25b6796d --- diff --git a/lib/Devel/REPL/Plugin/OutputCache.pm b/lib/Devel/REPL/Plugin/OutputCache.pm new file mode 100644 index 0000000..e9c339a --- /dev/null +++ b/lib/Devel/REPL/Plugin/OutputCache.pm @@ -0,0 +1,104 @@ +package Devel::REPL::Plugin::OutputCache; + +use Moose::Role; +use namespace::clean -except => [ 'meta' ]; + +has output_cache => ( + is => 'rw', + isa => 'ArrayRef', + default => sub { [] }, + lazy => 1, +); + +around 'eval' => sub { + my $orig = shift; + my ($self, $line) = @_; + + local *_ = sub () { $self->output_cache->[-1] }; + + my @ret; + if (wantarray) { + @ret = $self->$orig($line); + } + else { + $ret[0] = $self->$orig($line); + } + + push @{ $self->output_cache }, @ret > 1 ? \@ret : $ret[0]; + return wantarray ? @ret : $ret[0]; +}; + +1; + +__END__ + +=head1 NAME + +Devel::REPL::Plugin::OutputCache - remember past results, _ is most recent + +=head1 SYNOPSIS + + > 21 / 7 + 3 + > _ * _ + 9 + > sub { die "later" } + sub { die "later" } + > _->() + Runtime error: later + +=head1 DESCRIPTION + +Re-using results is very useful when working in a REPL. With C you +get C<_>, which holds the past result. The benefit is that you can build up +your result instead of having to type it in all at once, or store it in +intermediate variables. C also provides +C<< $_REPL->output_cache >>, an array reference of all results in this session. + +Devel::REPL already has a similar plugin, L. +There are some key differences though: + +=over 4 + +=item Input vs Output + +C remembers input. C remembers output. + +=item Munging vs Pure Perl + +C performs regular expressions on your input. C provides +the C<_> sub as a hook to get the most recent result, and +C<< $_REPL->output_cache >> for any other results. + +=item Principle of Least Surprise + +C will replace exclamation points in any part of the input. This is +problematic if you accidentally include one in a string, or in a C +expression. C uses a regular (if oddly named) subroutine so Perl +does the parsing -- no surprises. + +=back + +=head1 CAVEATS + +The C<_> sub is shared across all packages. This means that if a module is +using the C<_> sub, then there is a conflict and you should not use this +plugin. For example, L uses the C<_> sub for localization. Jifty is the +only known user. + +=head1 SEE ALSO + +C, C + +=head1 AUTHOR + +Shawn M Moore, C<< >> + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2007 by Shawn M Moore + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut