X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2FDevel-REPL.git;a=blobdiff_plain;f=lib%2FDevel%2FREPL%2FPlugin%2FNopaste.pm;h=accba68085865d4189f95df518b575ad6601ba05;hp=19e30ae976153a32f4c77ddae10cfb857f2e8aaa;hb=8d3a08168a12af4e191b519b19c5905de964181f;hpb=24cc824faa918e5ac9f61b122d7e22b1fc47219d diff --git a/lib/Devel/REPL/Plugin/Nopaste.pm b/lib/Devel/REPL/Plugin/Nopaste.pm index 19e30ae..accba68 100644 --- a/lib/Devel/REPL/Plugin/Nopaste.pm +++ b/lib/Devel/REPL/Plugin/Nopaste.pm @@ -1,36 +1,75 @@ package Devel::REPL::Plugin::Nopaste; -use Moose::Role; +use Devel::REPL::Plugin; use MooseX::AttributeHelpers; +use Moose::Util::TypeConstraints; use namespace::clean -except => [ 'meta' ]; +use Scalar::Util qw(blessed); -with 'Devel::REPL::Plugin::Turtles'; +sub BEFORE_PLUGIN { + my $self = shift; + $self->load_plugin('Turtles'); +} has complete_session => ( metaclass => 'String', is => 'rw', isa => 'Str', + lazy => 1, default => '', provides => { append => 'add_to_session', }, ); +has paste_title => ( + is => 'rw', + isa => 'Str', + lazy => 1, + default => 'Devel::REPL session', +); + +has 'nopaste_format' => ( + is => 'rw', + isa => enum( [qw[ comment_code comment_output ]] ), + lazy => 1, + default => 'comment_output', +); + +before eval => sub { + my $self = shift; + my $line = shift; + + if ( $self->nopaste_format() eq 'comment_code' ) { + # prepend each line with # + $line =~ s/^/# /mg; + } + + $self->add_to_session($line . "\n"); +}; + around eval => sub { my $orig = shift; my $self = shift; my $line = shift; my @ret = $orig->($self, $line, @_); + my @ret_as_str = map { + if (!defined($_)) { + ''; + } elsif (blessed($_) && $_->can('stringify')) { + $_->stringify(); + } else { + $_; + } + } @ret; - # prepend each line with # - $line =~ s/^/# /mg; + if ( $self->nopaste_format() eq 'comment_output' ) { + # prepend each line with # + map { $_ =~ s/^/# /mg } @ret_as_str; + } - my $step = $line . "\n" - . join("\n", @ret) - . "\n\n"; - - $self->add_to_session($step); + $self->add_to_session(join("\n", @ret_as_str) . "\n\n"); return @ret; }; @@ -41,10 +80,73 @@ sub command_nopaste { require App::Nopaste; return App::Nopaste->nopaste( text => $self->complete_session, - desc => "Devel::REPL session", + desc => $self->paste_title(), lang => "perl", ); } +sub command_pastetitle { + my ( $self, undef, $title ) = @_; + + $self->paste_title( $title ); +} + 1; +__END__ + +=head1 NAME + +Devel::REPL::Plugin::Nopaste - #nopaste to upload session's input and output + +=head1 COMMANDS + +This module provides these commands to your Devel::REPL shell: + +=head2 #nopaste + +The C<#nopaste> sends a transcript of your session to a nopaste +site. + +=head2 #pastetitle + +The C<#pastetitle> command allows you to set the title of the paste on +the nopaste site. For example: + +C<#pastetitle example of some code> + +defaults to 'Devel::REPL session' + +=head1 CONFIGURATION + +=head2 nopaste_format + +The format sent to the nopaste server can be adjusted with the +C option. By default, the output of each perl +statement is commented out, and the perl statements themselves are +not. This can be reversed by setting the C attribute +to C like this in your re.pl file: + +C<< $_REPL->nopaste_format( 'comment_code' ); >> + +The default of commenting out the output would be set like this: + +C<< $_REPL->nopaste_format( 'comment_output' ); >> + +These options can be set during a Devel::REPL session, but only affect +the future parts of the session, not the past parts. + +=head1 AUTHOR + +Shawn M Moore, C<< >> + +=head1 CONTRIBUTORS + +=over 4 + +=item Andrew Moore - C<< >> + +=back + +=cut +