From d1f721b320d72e83c0cb24c45fe9995a6dcf29c2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 12 Nov 2010 03:20:16 -0600 Subject: fix list_all_package_symbols --- lib/Package/Stash.pm | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'lib/Package/Stash.pm') diff --git a/lib/Package/Stash.pm b/lib/Package/Stash.pm index 132f687..4f1db68 100644 --- a/lib/Package/Stash.pm +++ b/lib/Package/Stash.pm @@ -381,7 +381,9 @@ sub remove_package_symbol { Returns a list of package variable names in the package, without sigils. If a C is passed, it is used to select package variables of a given type, where valid types are the slots of a typeglob ('SCALAR', 'CODE', 'HASH', -etc). +etc). Note that if the package contained any C blocks, perl will leave +an empty typeglob in the C slot, so this will show up if no filter is +used (and similarly for C, C, etc). =cut @@ -399,10 +401,20 @@ sub list_all_package_symbols { # any non-typeglob in the symbol table is a constant or stub ref(\$namespace->{$_}) ne 'GLOB' # regular subs are stored in the CODE slot of the typeglob - || defined(*{$namespace->{$_}}{CODE}); + || defined(*{$namespace->{$_}}{CODE}) + } keys %{$namespace}; + } + elsif ($type_filter eq 'SCALAR') { + return grep { + ref(\$namespace->{$_}) eq 'GLOB' + && defined(${*{$namespace->{$_}}{'SCALAR'}}) + } keys %{$namespace}; + } + else { + return grep { + ref(\$namespace->{$_}) eq 'GLOB' + && defined(*{$namespace->{$_}}{$type_filter}) } keys %{$namespace}; - } else { - return grep { *{$namespace->{$_}}{$type_filter} } keys %{$namespace}; } } -- cgit v1.2.3-54-g00ecf