Update: The problem description below is incorrect, but the design question is still appropriate. See
1149699 for a solution.
The problem you are hitting is that there is no guaranteed time for garbage collection. Therefore, garbage collection hasn't happen on the very short time scale for your test.
For the demo case, the simplest way of getting your desired output would be localizing, e.g.,
print One::foo();
{
my $count = Count->new;
no warnings 'redefine';
local *One::foo = sub { $count->{x} = 'x'; return "baz\n"; };
print One::foo();
}
print One::foo();
You could also use mock to bless into a subclass
One::Debug that looks like:
package One::Debug;
our @ISA = 'One';
sub foo {
return "baz\n";
}
1;
Really, what's going on here is a bit of an
XY Problem. You need to think on how to best encapsulate your patching to cover only your particular problem.
Incidentally, what you are trying use is traditionally called a guard. At least, I think that's what you are trying to do...
#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.