]> git.vpit.fr Git - perl/modules/subs-auto.git/blobdiff - lib/subs/auto.pm
5.11.2 fix
[perl/modules/subs-auto.git] / lib / subs / auto.pm
index 978ce41fc91b9b3aab744a98fd3415f3b9bfc11f..6b2dd5959af8fe6009c9398fb2c96ea398b66286 100644 (file)
@@ -16,11 +16,11 @@ subs::auto - Read barewords as subroutine names.
 
 =head1 VERSION
 
-Version 0.04
+Version 0.05
 
 =cut
 
-our $VERSION = '0.04';
+our $VERSION = '0.05';
 
 =head1 SYNOPSIS
 
@@ -97,7 +97,11 @@ my %core;
 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) = @_;
@@ -107,7 +111,9 @@ sub _reset {
   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/) {
@@ -122,40 +128,44 @@ sub _reset {
 sub _fetch {
  (undef, my $data, my $func) = @_;
  return if $data->{guard} or $func =~ /::/ or exists $core{$func};
- $data->{guard} = 1;
local $data->{guard} = 1;
  my $hints = (caller 0)[10];
  if ($hints and $hints->{subs__auto}) {
   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);
  }
- $data->{guard} = 0;
  return;
 }
 
 sub _store {
  (undef, my $data, my $func) = @_;
  return if $data->{guard};
- $data->{guard} = 1;
local $data->{guard} = 1;
  _reset($data->{pkg}, $func);
- $data->{guard} = 0;
  return;
 }
 
-my $wiz = wizard data  => sub { +{ pkg => $_[1] } },
+my $wiz = wizard data  => sub { +{ pkg => $_[1], guard => 0 } },
                  fetch => \&_fetch,
                  store => \&_store;