X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FSub-Op.git;a=blobdiff_plain;f=lib%2FSub%2FOp.pm;h=c075bbb8612aae2b8fe7502139a8ad8419116341;hp=c8f7c2e24d156c0686aa15e71a63fa5dd5a2fafb;hb=a3c83d0adc138681da18079c268948d2fe9326d7;hpb=ed2a5a35c26bfa677e6d2bc5586068b9a28735dc diff --git a/lib/Sub/Op.pm b/lib/Sub/Op.pm index c8f7c2e..c075bbb 100644 --- a/lib/Sub/Op.pm +++ b/lib/Sub/Op.pm @@ -142,8 +142,14 @@ my $sw = Variable::Magic::wizard( my $pkg = $data->{pkg}; my $fqn = join '::', $pkg, $name; - no strict 'refs'; - *$fqn = $placeholder unless exists &$fqn; + { + local $SIG{__WARN__} = sub { + CORE::warn(@_) unless $_[0] =~ /^Constant subroutine.*redefined/; + } if _constant_sub(do { no strict 'refs'; \&$fqn }); + no strict 'refs'; + no warnings 'redefine'; + *$fqn = $placeholder; + } return; }, @@ -155,6 +161,7 @@ sub _tag { my $fqn = join '::', $pkg, $name; return { + old => _defined_sub($fqn) ? \&$fqn : undef, proto => prototype($fqn), }; } @@ -296,11 +303,22 @@ sub disable { my $pkg = @_ > 0 ? $_[0] : caller; my $map = _map($pkg); + my $fqn = join '::', $pkg, $name; + if (defined $map) { - my $proto = $map->{$name}->{proto}; + my $tag = $map->{$name}; + + my $old = $tag->{old}; + if (defined $old) { + no strict 'refs'; + no warnings 'redefine'; + *$fqn = $old; + } + + my $proto = $tag->{proto}; if (defined $proto) { no strict 'refs'; - Scalar::Util::set_prototype(\&{"${pkg}::$name"}, $proto); + Scalar::Util::set_prototype(\&$fqn, $proto); } delete $map->{$name};