From: Jesse Luehrs Date: Fri, 27 Aug 2010 03:13:30 +0000 (-0500) Subject: cache the ref to the stash X-Git-Tag: 0.06~1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=e55970bce6430bcc6cd014bc46983c100f660e79;p=gitmo%2FPackage-Stash.git cache the ref to the stash --- diff --git a/lib/Package/Stash.pm b/lib/Package/Stash.pm index d81c96e..32e5d30 100644 --- a/lib/Package/Stash.pm +++ b/lib/Package/Stash.pm @@ -33,8 +33,18 @@ argument. sub new { my $class = shift; - my ($namespace) = @_; - return bless { 'package' => $namespace }, $class; + 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, + }, $class; } =method name @@ -54,15 +64,7 @@ Returns the raw stash itself. =cut sub namespace { - # NOTE: - # because of issues with the Perl API - # to the typeglob in some versions, we - # need to just always grab a new - # reference to the hash here. Ideally - # we could just store a ref and it would - # Just Work, but oh well :\ - no strict 'refs'; - return \%{$_[0]->name . '::'}; + return $_[0]->{namespace}; } { diff --git a/t/02-extension.t b/t/02-extension.t index 2f95f15..f639cfa 100644 --- a/t/02-extension.t +++ b/t/02-extension.t @@ -13,8 +13,11 @@ use Test::Exception; use Symbol 'gensym'; - sub namespace { - $_[0]->{namespace} ||= {} + sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + $self->{namespace} = {}; + return $self; } sub add_package_symbol {