From 64c74c4d2d2718a2059cc4dbc1626e4eb2b068db Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 25 Jan 2011 15:09:37 -0600 Subject: initial implementation --- lib/circular/require.pm | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'lib') 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; -- cgit v1.2.3-54-g00ecf