summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Walde <walde.christian@googlemail.com>2012-11-09 14:48:35 +0100
committerJesse Luehrs <doy@tozt.net>2013-01-03 21:29:56 -0600
commitf4e53d90c9bf2c9d26e8155b5f9221cdb8fcb9a7 (patch)
tree65d0b36034f6d5e113b03dbf33be2fed2758fe41
parent27c82de8c5a52ccf67c053a5c8e617c999bbb6e7 (diff)
downloadpackage-stash-f4e53d90c9bf2c9d26e8155b5f9221cdb8fcb9a7.tar.gz
package-stash-f4e53d90c9bf2c9d26e8155b5f9221cdb8fcb9a7.zip
golfed the remove_symbol function
-rw-r--r--lib/Package/Stash/PP.pm62
1 files changed, 17 insertions, 45 deletions
diff --git a/lib/Package/Stash/PP.pm b/lib/Package/Stash/PP.pm
index 71ee4e5..b8f3ed9 100644
--- a/lib/Package/Stash/PP.pm
+++ b/lib/Package/Stash/PP.pm
@@ -330,56 +330,28 @@ sub remove_symbol {
# no doubt this is grossly inefficient and
# could be done much easier and faster in XS
- my ($scalar_desc, $array_desc, $hash_desc, $code_desc, $io_desc) = (
- { sigil => '$', type => 'SCALAR', name => $name },
- { sigil => '@', type => 'ARRAY', name => $name },
- { sigil => '%', type => 'HASH', name => $name },
- { sigil => '&', type => 'CODE', name => $name },
- { sigil => '', type => 'IO', name => $name },
+ my %desc = (
+ SCALAR => { sigil => '$', type => 'SCALAR', name => $name },
+ ARRAY => { sigil => '@', type => 'ARRAY', name => $name },
+ HASH => { sigil => '%', type => 'HASH', name => $name },
+ CODE => { sigil => '&', type => 'CODE', name => $name },
+ IO => { sigil => '', type => 'IO', name => $name },
);
+ confess "This should never ever ever happen" if !$desc{$type};
- my ($scalar, $array, $hash, $code, $io);
- if ($type eq 'SCALAR') {
- $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc);
- $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc);
- $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc);
- $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc);
- }
- elsif ($type eq 'ARRAY') {
- $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION;
- $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc);
- $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc);
- $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc);
- }
- elsif ($type eq 'HASH') {
- $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION;
- $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc);
- $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc);
- $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc);
- }
- elsif ($type eq 'CODE') {
- $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION;
- $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc);
- $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc);
- $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc);
- }
- elsif ($type eq 'IO') {
- $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION;
- $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc);
- $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc);
- $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc);
- }
- else {
- confess "This should never ever ever happen";
- }
+ my @types_to_store = grep { $type ne $_ && $self->has_symbol($desc{$_}) }
+ keys %desc;
+ my %values = map { $_, $self->get_symbol($desc{$_}) } @types_to_store;
+
+ $values{SCALAR} = $self->get_symbol($desc{SCALAR})
+ if !defined $values{SCALAR}
+ && $type ne 'SCALAR'
+ && BROKEN_SCALAR_INITIALIZATION;
$self->remove_glob($name);
- $self->add_symbol($scalar_desc => $scalar) if defined $scalar;
- $self->add_symbol($array_desc => $array) if defined $array;
- $self->add_symbol($hash_desc => $hash) if defined $hash;
- $self->add_symbol($code_desc => $code) if defined $code;
- $self->add_symbol($io_desc => $io) if defined $io;
+ $self->add_symbol($desc{$_} => $values{$_})
+ for grep { defined $values{$_} } keys %values;
}
sub list_all_symbols {