summaryrefslogtreecommitdiffstats
path: root/lib/circular/require.pm
blob: 882b2b773e21e446ec15f8ad530e9c9e3c7d1754 (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
package circular::require;
use strict;
use warnings;
use Package::Stash;

my %seen;
my $saved;

sub _require {
    my ($file) = @_;
    if (exists $seen{$file} && !$seen{$file}) {
        warn "Circular require detected: $file (from " . caller() . ")\n";
    }
    $seen{$file} = 0;
    my $ret = $saved ? $saved->($file) : CORE::require($file);
    $seen{$file} = 1;
    return $ret;
}

sub import {
    my $stash = Package::Stash->new('CORE::GLOBAL');
    if ($saved) {
        $stash->add_package_symbol('&require' => $saved);
    }
    else {
        $stash->remove_package_symbol('&require');
    }
}

sub unimport {
    my $stash = Package::Stash->new('CORE::GLOBAL');
    my $old_require = $stash->get_package_symbol('&require');
    $saved = $old_require
        if defined($old_require) && $old_require != \&_require;
    $stash->add_package_symbol('&require', \&_require);
}

1;