summaryrefslogtreecommitdiffstats
path: root/lib/Reply/Plugin/LoadClass.pm
blob: cbffb024be282497a25e172dac012e2e7a6b9e0a (plain) (blame)
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
package main;
use strict;
use warnings;
# ABSTRACT: attempts to load classes implicitly if possible

use mop;

use Module::Runtime 'use_package_optimistically';
use Try::Tiny;

=head1 SYNOPSIS

  ; .replyrc
  [LoadClass]

=head1 DESCRIPTION

If executing a line of code fails due to a method not being defined on a
package, this plugin will load the corresponding module and then try executing
the line again. This simplifies common cases like running C<< DateTime->now >>
at the prompt before loading L<DateTime> - this plugin will cause DateTime to
be loaded implicitly.

=cut

class Reply::Plugin::LoadClass extends Reply::Plugin {
    method execute ($next, @args) {
        try {
            $next->(@args);
        }
        catch {
            if (/^Can't locate object method "[^"]*" via package "([^"]*)"/) {
                use_package_optimistically($1);
                $next->(@args);
            }
            else {
                die $_;
            }
        }
    }
}

1;