delete @core{qw/my local/};
undef @core;
-my $tag = wizard data => sub { 1 };
+BEGIN {
+ *_REFCNT_PLACEHOLDERS = eval 'sub () { ' . ($] < 5.011002 ? 0 : 1) . '}'
+}
+
+my $tag = wizard data => sub { \(my $data = _REFCNT_PLACEHOLDERS ? 2 : 1) };
sub _reset {
my ($pkg, $func) = @_;
no warnings 'once';
*$fqn{CODE};
};
- if ($cb and getdata(&$cb, $tag)) {
+ if ($cb and defined(my $data = getdata(&$cb, $tag))) {
+ $$data--;
+ return if $$data > 0;
no strict 'refs';
my $sym = gensym;
for (qw/SCALAR ARRAY HASH IO FORMAT/) {
my $mod = $func . '.pm';
if (not exists $INC{$mod}) {
my $fqn = $data->{pkg} . '::' . $func;
- if (do { no strict 'refs'; not *$fqn{CODE} || *$fqn{IO}}) {
- my $cb = sub {
- my ($file, $line) = (caller 0)[1, 2];
- ($file, $line) = ('(eval 0)', 0) unless $file && $line;
- die "Undefined subroutine &$fqn called at $file line $line\n";
- };
- cast &$cb, $tag;
- no strict 'refs';
- *$fqn = $cb;
+ my $cb = do { no strict 'refs'; *$fqn{CODE} };
+ if ($cb) {
+ if (_REFCNT_PLACEHOLDERS and defined(my $data = getdata(&$cb, $tag))) {
+ ++$$data;
+ }
+ return;
}
+ return if do { no strict 'refs'; *$fqn{IO} };
+ $cb = sub {
+ my ($file, $line) = (caller 0)[1, 2];
+ ($file, $line) = ('(eval 0)', 0) unless $file && $line;
+ die "Undefined subroutine &$fqn called at $file line $line\n";
+ };
+ cast &$cb, $tag;
+ no strict 'refs';
+ *$fqn = $cb;
}
} else {
_reset($data->{pkg}, $func);