X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPackage%2FStash.pm;fp=lib%2FPackage%2FStash.pm;h=4f1db68885c7fe2039697da5bd5f15e4a24c0ff9;hb=d1f721b320d72e83c0cb24c45fe9995a6dcf29c2;hp=132f687d6999025f331e05ada5c6cfe7bbdf6ca6;hpb=f75437398a7a18f7852b0151f7cb808dbeb06d0a;p=gitmo%2FPackage-Stash-PP.git 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}; } }