use strict;
use warnings;
+use B;
use Scalar::Util 'blessed';
use Carp 'confess';
-our $VERSION = '0.69';
+our $VERSION = '0.74';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
} else {
my $meta = ( ref $class || $class )->_new({
'package' => $package_name,
+ %options,
});
Class::MOP::store_metaclass_by_name($package_name, $meta);
my $namespace = $self->namespace;
- return %$namespace unless defined $type_filter;
+ if (wantarray) {
+ warn 'Class::MOP::Package::get_all_package_symbols in list context is deprecated. use scalar context instead.';
+ }
+
+ return (wantarray ? %$namespace : $namespace) unless defined $type_filter;
+ my %ret;
# for some reason this nasty impl is orders of magnitude faster than a clean version
if ( $type_filter eq 'CODE' ) {
my $pkg;
no strict 'refs';
- return map {
+ %ret = map {
(ref($namespace->{$_})
? ( $_ => \&{$pkg ||= $self->name . "::$_"} )
- : ( (*{$namespace->{$_}}{CODE}) # the extra parents prevent breakage on 5.8.2
+ : ( ref \$namespace->{$_} eq 'GLOB' # don't use {CODE} unless it's really a glob to prevent stringification of stubs
+ && (*{$namespace->{$_}}{CODE}) # the extra parents prevent breakage on 5.8.2
? ( $_ => *{$namespace->{$_}}{CODE} )
- : () ) )
+ : (do {
+ my $sym = B::svref_2object(\$namespace->{$_});
+ my $svt = ref $sym if $sym;
+ ($sym && ($svt eq 'B::PV' || $svt eq 'B::IV'))
+ ? ($_ => ($pkg ||= $self->name)->can($_))
+ : () }) ) )
} keys %$namespace;
} else {
- return map {
+ %ret = map {
$_ => *{$namespace->{$_}}{$type_filter}
} grep {
!ref($namespace->{$_}) && *{$namespace->{$_}}{$type_filter}
} keys %$namespace;
}
+
+ return wantarray ? %ret : \%ret;
}
1;
L<Class::MOP::Class> and provides all of the symbol table
introspection methods.
+=head1 INHERITANCE
+
+B<Class::MOP::Package> is a subclass of L<Class::MOP::Object>
+
=head1 METHODS
=over 4