Revision f93b80e4
Von Moritz Bunkus vor mehr als 6 Jahren hinzugefügt
Devel/REPL/Plugin/AutoloadModules.pm | ||
---|---|---|
package Devel::REPL::Plugin::AutoloadModules;
|
||
|
||
use Moose::Role;
|
||
use namespace::clean -except => [ 'meta' ];
|
||
use Data::Dumper;
|
||
|
||
has 'autoloaded' => ( is => 'rw', isa => 'HashRef', default => sub { {} } );
|
||
|
||
my $re = qr/Runtime error: Can.t locate object method "\w+" via package "\w+" \(perhaps you forgot to load "(\w+)"\?\)/;
|
||
around 'execute' => sub {
|
||
my $orig = shift;
|
||
my $self = shift;
|
||
|
||
my @re = $self->$orig(@_); # original call
|
||
|
||
return @re unless defined $re[0] && $re[0] =~ /$re/; # if there is no "perhaps you forgot" error, just return
|
||
my $module = $1; # save the missing package name
|
||
|
||
return @re if $self->autoloaded->{$module}; # if we tried to load it before, give up and return the error
|
||
|
||
$self->autoloaded->{$module} = 1; # make sure we don't try this again
|
||
$self->eval("use SL::$module"); # try to load the missing module
|
||
|
||
@re = $self->$orig(@_); # try again
|
||
|
||
return @re;
|
||
};
|
||
|
||
1;
|
Devel/REPL/Plugin/PermanentHistory.pm | ||
---|---|---|
package Devel::REPL::Plugin::PermanentHistory;
|
||
|
||
use Moose::Role;
|
||
use namespace::clean -except => [ 'meta' ];
|
||
use File::Slurp;
|
||
use Data::Dumper;
|
||
|
||
has 'history_file' => ( is => 'rw' );
|
||
|
||
sub load_history {
|
||
my $self = shift;
|
||
my $file = shift;
|
||
|
||
$self->history_file( $file );
|
||
|
||
return unless $self->history_file && -f $self->history_file;
|
||
|
||
my @history =
|
||
map { chomp; $_ }
|
||
read_file($self->history_file);
|
||
# print Dumper(\@history);
|
||
$self->history( \@history );
|
||
$self->term->addhistory($_) for @history;
|
||
}
|
||
|
||
before 'DESTROY' => sub {
|
||
my $self = shift;
|
||
|
||
return unless $self->history_file;
|
||
|
||
write_file $self->history_file,
|
||
map { $_, $/ }
|
||
grep $_,
|
||
grep { !/^quit\b/ }
|
||
@{ $self->history };
|
||
};
|
||
|
||
1;
|
||
|
modules/override/Devel/REPL/Plugin/AutoloadModules.pm | ||
---|---|---|
package Devel::REPL::Plugin::AutoloadModules;
|
||
|
||
use Moose::Role;
|
||
use namespace::clean -except => [ 'meta' ];
|
||
use Data::Dumper;
|
||
|
||
has 'autoloaded' => ( is => 'rw', isa => 'HashRef', default => sub { {} } );
|
||
|
||
my $re = qr/Runtime error: Can.t locate object method "\w+" via package "\w+" \(perhaps you forgot to load "(\w+)"\?\)/;
|
||
around 'execute' => sub {
|
||
my $orig = shift;
|
||
my $self = shift;
|
||
|
||
my @re = $self->$orig(@_); # original call
|
||
|
||
return @re unless defined $re[0] && $re[0] =~ /$re/; # if there is no "perhaps you forgot" error, just return
|
||
my $module = $1; # save the missing package name
|
||
|
||
return @re if $self->autoloaded->{$module}; # if we tried to load it before, give up and return the error
|
||
|
||
$self->autoloaded->{$module} = 1; # make sure we don't try this again
|
||
$self->eval("use SL::$module"); # try to load the missing module
|
||
|
||
@re = $self->$orig(@_); # try again
|
||
|
||
return @re;
|
||
};
|
||
|
||
1;
|
modules/override/Devel/REPL/Plugin/PermanentHistory.pm | ||
---|---|---|
package Devel::REPL::Plugin::PermanentHistory;
|
||
|
||
use Moose::Role;
|
||
use namespace::clean -except => [ 'meta' ];
|
||
use File::Slurp;
|
||
use Data::Dumper;
|
||
|
||
has 'history_file' => ( is => 'rw' );
|
||
|
||
sub load_history {
|
||
my $self = shift;
|
||
my $file = shift;
|
||
|
||
$self->history_file( $file );
|
||
|
||
return unless $self->history_file && -f $self->history_file;
|
||
|
||
my @history =
|
||
map { chomp; $_ }
|
||
read_file($self->history_file);
|
||
# print Dumper(\@history);
|
||
$self->history( \@history );
|
||
$self->term->addhistory($_) for @history;
|
||
}
|
||
|
||
before 'DESTROY' => sub {
|
||
my $self = shift;
|
||
|
||
return unless $self->history_file;
|
||
|
||
write_file $self->history_file,
|
||
map { $_, $/ }
|
||
grep $_,
|
||
grep { !/^quit\b/ }
|
||
@{ $self->history };
|
||
};
|
||
|
||
1;
|
||
|
Auch abrufbar als: Unified diff
Module: Devel::REPL::Plugin::* aus modules/override verschoben
Es handelt sich um explizit für kivitendo geschriebene Module, daher
sind sie im override falsch.