Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / Devel / REPL / Plugin / AutoloadModules.pm
diff --git a/Devel/REPL/Plugin/AutoloadModules.pm b/Devel/REPL/Plugin/AutoloadModules.pm
new file mode 100644 (file)
index 0000000..e36ee96
--- /dev/null
@@ -0,0 +1,29 @@
+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;