summaryrefslogtreecommitdiffstats
path: root/lib/Package/Stash/PP.pm
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2011-03-04 11:59:06 -0600
committerJesse Luehrs <doy@tozt.net>2011-03-04 11:59:06 -0600
commiteb53b1bd771d2bed902655654014680ea64cf8d4 (patch)
tree85ce1876c3a64d8225285cfc4a0f326031885272 /lib/Package/Stash/PP.pm
parente70564920d68b0b907952e3302aa08ccb201b080 (diff)
downloadpackage-stash-eb53b1bd771d2bed902655654014680ea64cf8d4.tar.gz
package-stash-eb53b1bd771d2bed902655654014680ea64cf8d4.zip
make the namespace cache lazy and weak, in case the stash is deleted
Diffstat (limited to 'lib/Package/Stash/PP.pm')
-rw-r--r--lib/Package/Stash/PP.pm22
1 files changed, 13 insertions, 9 deletions
diff --git a/lib/Package/Stash/PP.pm b/lib/Package/Stash/PP.pm
index d6ca34b..653eeaf 100644
--- a/lib/Package/Stash/PP.pm
+++ b/lib/Package/Stash/PP.pm
@@ -4,7 +4,7 @@ use warnings;
# ABSTRACT: pure perl implementation of the Package::Stash API
use Carp qw(confess);
-use Scalar::Util qw(blessed reftype);
+use Scalar::Util qw(blessed reftype weaken);
use Symbol;
# before 5.12, assigning to the ISA glob would make it lose its magical ->isa
# powers
@@ -24,15 +24,8 @@ sub new {
my $class = shift;
my ($package) = @_;
my $namespace;
- {
- no strict 'refs';
- # supposedly this caused a bug in earlier perls, but I can't reproduce
- # it, so re-enabling the caching
- $namespace = \%{$package . '::'};
- }
return bless {
- 'package' => $package,
- 'namespace' => $namespace,
+ 'package' => $package,
}, $class;
}
@@ -45,6 +38,17 @@ sub name {
sub namespace {
confess "Can't call namespace as a class method"
unless blessed($_[0]);
+ return $_[0]->{namespace} if defined $_[0]->{namespace};
+
+ {
+ 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 . '::'};
+ }
+
+ weaken($_[0]->{namespace});
+
return $_[0]->{namespace};
}