summaryrefslogtreecommitdiffstats
path: root/lib/Reply/Plugin/AutoRefresh.pm
blob: 28daac5d063450527a4530e198b3f7bb75d3a7cf (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
44
45
46
47
48
49
50
51
52
53
package main;
use strict;
use warnings;
# ABSTRACT: automatically refreshes the external code you use

use mop;

use Class::Refresh 0.05 ();

=head1 SYNOPSIS

  ; .replyrc
  [AutoRefresh]
  track_require = 1

=head1 DESCRIPTION

This plugin automatically refreshes all loaded modules before every
statement execution. It's useful if you are working on a module in
a file and you want the changes to automatically be loaded in Reply.

It takes a single argument, C<track_require>, which defaults to true.
If this option is set, the C<track_require> functionality from
L<Class::Refresh> will be enabled.

Note that to use the C<track_require> functionality, this module must
be loaded as early as possible (preferably first), so that other
modules correctly see the global override.

=cut

class Reply::Plugin::AutoRefresh extends Reply::Plugin {
    has $track_require = 1;

    submethod BUILD {
        Class::Refresh->import(track_require => $track_require);

        # so that when we load things after this plugin, they get a copy of
        # Module::Runtime which has the call to require() rebound to our
        # overridden copy. if this plugin is loaded first, these should be the
        # only modules loaded so far which load arbitrary user-specified
        # modules.
        Class::Refresh->refresh_module('Module::Runtime');
        Class::Refresh->refresh_module('base');
    }

    method compile ($next, @args) {
        Class::Refresh->refresh;
        $next->(@args);
    }
}

1;