summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2011-01-25 15:09:37 -0600
committerJesse Luehrs <doy@tozt.net>2011-01-25 15:09:37 -0600
commit64c74c4d2d2718a2059cc4dbc1626e4eb2b068db (patch)
tree5351e0f3eebb510cd2dab4ee7ca871036fd1bd14 /lib
parent47b406fc2ae8a479813ff55cc172abcf6596b919 (diff)
downloadcircular-require-64c74c4d2d2718a2059cc4dbc1626e4eb2b068db.tar.gz
circular-require-64c74c4d2d2718a2059cc4dbc1626e4eb2b068db.zip
initial implementation
Diffstat (limited to 'lib')
-rw-r--r--lib/circular/require.pm38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/circular/require.pm b/lib/circular/require.pm
index e69de29..882b2b7 100644
--- a/lib/circular/require.pm
+++ b/lib/circular/require.pm
@@ -0,0 +1,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;