summaryrefslogtreecommitdiffstats
path: root/lib/Reply/Plugin/AutoRefresh.pm
blob: 3a21dfb27f574ddbb3aed70cb0cc6d89661c0a96 (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
54
55
56
57
58
package Reply::Plugin::AutoRefresh;
use strict;
use warnings;
# ABSTRACT: automatically refreshes the external code you use

use base 'Reply::Plugin';
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

sub new {
    my $class = shift;
    my %opts = @_;

    $opts{track_require} = 1
        unless defined $opts{track_require};

    Class::Refresh->import(track_require => $opts{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');

    return $class->SUPER::new(@_);
}

sub compile {
    my $self = shift;
    my ($next, @args) = @_;

    Class::Refresh->refresh;
    $next->(@args);
}

1;