/usr/share/perl5/Devel/REPL/Plugin/Turtles.pm is in libdevel-repl-perl 1.003012-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | package Devel::REPL::Plugin::Turtles;
use Devel::REPL::Plugin;
use Scalar::Util qw(reftype);
use MooseX::AttributeHelpers;
use namespace::clean -except => [ 'meta' ];
has default_command_prefix => (
isa => "RegexpRef",
is => "rw",
default => sub { qr/\#/ },
);
has turtles_matchers => (
metaclass => "Collection::Array",
isa => "ArrayRef[RegexpRef|CodeRef]",
is => "rw",
lazy => 1,
default => sub { my $prefix = shift->default_command_prefix; [qr/^ $prefix (\w+) \s* (.*) /x] },
provides => {
unshift => "add_turtles_matcher",
},
);
around 'formatted_eval' => sub {
my $next = shift;
my ($self, $line, @args) = @_;
if ( my ( $command, @rest ) = $self->match_turtles($line) ) {
my $method = "command_$command";
my $expr_method = "expr_$method";
if ( my $expr_code = $self->can($expr_method) ) {
if ( my $read_more = $self->can("continue_reading_if_necessary") ) {
push @rest, $self->$read_more(pop @rest);
}
$self->$expr_code($next, @rest);
} elsif ( my $cmd_code = $self->can($method) ) {
return $self->$cmd_code($next, @rest);
} else {
unless ( $line =~ /^\s*#/ ) { # special case for comments
return $self->format($self->error_return("REPL Error", "Command '$command' does not exist"));
}
}
} else {
return $self->$next($line, @args);
}
};
sub match_turtles {
my ( $self, $line ) = @_;
foreach my $thingy ( @{ $self->turtles_matchers } ) {
if ( reftype $thingy eq 'CODE' ) {
if ( my @res = $self->$thingy($line) ) {
return @res;
}
} else {
if ( my @res = ( $line =~ $thingy ) ) {
return @res;
}
}
}
return;
}
1;
__END__
=head1 NAME
Devel::REPL::Plugin::Turtles - Generic command creation using a read hook
=head1 DESCRIPTION
By default, this plugin allows calling commands using a read hook
to detect a default_command_prefix followed by the command name,
say MYCMD as an example. The actual routine to call for the
command is constructed by looking for subs named 'command_MYCMD'
or 'expr_MYCMD' and executing them.
=head2 NOTE
The C<default_command_prefix> is C<qr/\#/> so care must be taken
if other uses for that character are needed (e.g., '#' for the
shell escape character in the PDL shell.
=cut
|