summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-01-06 10:28:20 -0600
committerJesse Luehrs <doy@tozt.net>2012-01-06 10:35:56 -0600
commitf37c8c6a403486522d197d9749ab3c7e7d9105ab (patch)
treed2f8f28ef36784169de8cdf5b83f476a51dd6329 /lib
parent287563c99fd663d619916b60b24ebb60bf08591d (diff)
downloadcircular-require-f37c8c6a403486522d197d9749ab3c7e7d9105ab.tar.gz
circular-require-f37c8c6a403486522d197d9749ab3c7e7d9105ab.zip
not lexical scope, but dynamic scope is close enough i think
Diffstat (limited to 'lib')
-rw-r--r--lib/circular/require.pm26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/circular/require.pm b/lib/circular/require.pm
index 1d9e38d..184c361 100644
--- a/lib/circular/require.pm
+++ b/lib/circular/require.pm
@@ -53,6 +53,17 @@ our $previous_file;
my $saved_require_hook;
my @hide;
+sub _find_enable_state {
+ my $depth = 0;
+ while (defined(scalar(caller(++$depth)))) {
+ my $hh = (caller($depth))[10];
+ next unless defined $hh;
+ next unless exists $hh->{'circular::require'};
+ return $hh->{'circular::require'};
+ }
+ return 0;
+}
+
sub _require {
my ($file) = @_;
# on 5.8, if a value has both a string and numeric value, require will
@@ -71,11 +82,13 @@ sub _require {
$caller = $loaded_from{$caller};
}
- if (@cycle > 1) {
- warn "Circular require detected:\n " . join("\n ", @cycle) . "\n";
- }
- else {
- warn "Circular require detected in $string_file (from unknown file)\n";
+ if (_find_enable_state()) {
+ if (@cycle > 1) {
+ warn "Circular require detected:\n " . join("\n ", @cycle) . "\n";
+ }
+ else {
+ warn "Circular require detected in $string_file (from unknown file)\n";
+ }
}
}
local $loaded_from{$string_file} = $previous_file;
@@ -108,6 +121,8 @@ sub import {
else {
$stash->remove_package_symbol('&require');
}
+ # not delete, because we want to see it being explicitly disabled
+ $^H{'circular::require'} = 0;
}
sub unimport {
@@ -123,6 +138,7 @@ sub unimport {
$saved_require_hook = $old_require
if defined($old_require) && $old_require != \&_require;
$stash->add_package_symbol('&require', \&_require);
+ $^H{'circular::require'} = 1;
}
sub _mod2pm {