diff options
author | Jesse Luehrs <doy@tozt.net> | 2010-09-18 20:18:20 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2010-09-18 20:18:20 -0500 |
commit | 5d3589c862fc8593a95ac572b8eb20e97a593a0c (patch) | |
tree | 69ca8cd9b3658c235951d840c11c0da6299a897a /lib | |
parent | 759031e2653d734955eb57cf8fbac9e1ef8af3e3 (diff) | |
download | package-stash-5d3589c862fc8593a95ac572b8eb20e97a593a0c.tar.gz package-stash-5d3589c862fc8593a95ac572b8eb20e97a593a0c.zip |
Revert "revert the vivication changes for now, i didn't mean to release them"
This reverts commit 44726d1abdc534e4ac6ddfc6d91d245c8dc0ebc7.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Package/Stash.pm | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/lib/Package/Stash.pm b/lib/Package/Stash.pm index 32e5d30..77236d0 100644 --- a/lib/Package/Stash.pm +++ b/lib/Package/Stash.pm @@ -5,6 +5,7 @@ use warnings; use Carp qw(confess); use Scalar::Util qw(reftype); +use Symbol; =head1 SYNOPSIS @@ -229,22 +230,32 @@ sub get_package_symbol { my $namespace = $self->namespace; - if (!exists $namespace->{$name}) { - # assigning to the result of this function like - # @{$stash->get_package_symbol('@ISA')} = @new_ISA - # makes the result not visible until the variable is explicitly - # accessed... in the case of @ISA, this might never happen - # for instance, assigning like that and then calling $obj->isa - # will fail. see t/005-isa.t - if ($opts{vivify} && $type eq 'ARRAY' && $name ne 'ISA') { - $self->add_package_symbol($variable, []); + if ($opts{vivify} && !exists $namespace->{$name}) { + if ($type eq 'ARRAY') { + $self->add_package_symbol( + $variable, + # setting our own arrayref manually loses the magicalness or + # something + $name eq 'ISA' ? () : ([]) + ); } - elsif ($opts{vivify} && $type eq 'HASH') { + elsif ($type eq 'HASH') { $self->add_package_symbol($variable, {}); } + elsif ($type eq 'SCALAR') { + $self->add_package_symbol($variable); + } + elsif ($type eq 'IO') { + $self->add_package_symbol($variable, Symbol::geniosym); + } + elsif ($type eq 'CODE') { + # ignoring this case for now, since i don't know what would + # be useful to do here (and subs in the stash autovivify in weird + # ways too) + #$self->add_package_symbol($variable, sub {}); + } else { - # FIXME - $self->add_package_symbol($variable) + confess "Unknown type $type in vivication"; } } |