disable caching of the namespace on 5.8
Jesse Luehrs [Fri, 4 Mar 2011 18:59:02 +0000 (12:59 -0600)]
lib/Package/Stash/PP.pm
t/02-extension.t

index 653eeaf..60c486a 100644 (file)
@@ -9,6 +9,9 @@ use Symbol;
 # before 5.12, assigning to the ISA glob would make it lose its magical ->isa
 # powers
 use constant BROKEN_ISA_ASSIGNMENT => ($] < 5.012);
+# before 5.10, stashes don't ever seem to drop to a refcount of zero, so
+# weakening them isn't helpful
+use constant BROKEN_WEAK_STASH     => ($] < 5.010);
 
 =head1 SYNOPSIS
 
@@ -38,18 +41,23 @@ sub name {
 sub namespace {
     confess "Can't call namespace as a class method"
         unless blessed($_[0]);
-    return $_[0]->{namespace} if defined $_[0]->{namespace};
 
-    {
+    if (BROKEN_WEAK_STASH) {
         no strict 'refs';
-        # supposedly this caused a bug in earlier perls, but I can't reproduce
-        # it, so re-enabling the caching
-        $_[0]->{namespace} = \%{$_[0]->name . '::'};
+        return \%{$_[0]->name . '::'};
     }
+    else {
+        return $_[0]->{namespace} if defined $_[0]->{namespace};
 
-    weaken($_[0]->{namespace});
+        {
+            no strict 'refs';
+            $_[0]->{namespace} = \%{$_[0]->name . '::'};
+        }
 
-    return $_[0]->{namespace};
+        weaken($_[0]->{namespace});
+
+        return $_[0]->{namespace};
+    }
 }
 
 {
index 2096221..f8e4752 100644 (file)
@@ -21,6 +21,8 @@ use Test::Fatal;
         return $self;
     }
 
+    sub namespace { shift->{namespace} }
+
     sub add_symbol {
         my ($self, $variable, $initial_value) = @_;