From 5d3589c862fc8593a95ac572b8eb20e97a593a0c Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 18 Sep 2010 20:18:20 -0500 Subject: Revert "revert the vivication changes for now, i didn't mean to release them" This reverts commit 44726d1abdc534e4ac6ddfc6d91d245c8dc0ebc7. --- lib/Package/Stash.pm | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'lib/Package') 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"; } } -- cgit v1.2.3-54-g00ecf