3 package Devel::REPL::Plugin::Commands;
4 # ABSTRACT: Generic command creation plugin using injected functions
6 our $VERSION = '1.003027';
8 use Devel::REPL::Plugin;
9 use Scalar::Util qw(weaken);
10 use namespace::autoclean;
12 our $COMMAND_INSTALLER;
14 has 'command_set' => (
16 lazy => 1, default => sub { {} }
21 $self->load_plugin('Packages');
22 unless ($self->can('setup_commands')) {
23 $self->meta->add_method('setup_commands' => sub {});
29 $self->setup_commands;
32 after 'setup_commands' => sub {
35 $self->command_set->{load_plugin} = sub {
37 sub { $self->load_plugin(@_); };
41 sub command_installer {
43 my $command_set = $self->command_set;
44 my %command_subs = map {
45 ($_ => $command_set->{$_}->($self));
49 foreach my $command (keys %command_subs) {
51 no warnings 'redefine';
52 *{"${package}::${command}"} = $command_subs{$command};
57 around 'mangle_line' => sub {
58 my ($orig, $self) = (shift, shift);
60 my $name = '$'.__PACKAGE__.'::COMMAND_INSTALLER';
61 return qq{BEGIN { ${name}->(__PACKAGE__) }\n}.$self->$orig(@_);
64 around 'compile' => sub {
65 my ($orig, $self) = (shift, shift);
66 local $COMMAND_INSTALLER = $self->command_installer;