use warnings;
use metaclass;
-use Sub::Name 'subname';
use Carp 'confess';
use Scalar::Util 'blessed', 'reftype';
-our $VERSION = '0.12';
+our $VERSION = '0.14';
our $AUTHORITY = 'cpan:STEVAN';
use Moose::Meta::Class;
my $role_name = $self->name;
my $method_metaclass = $self->method_metaclass;
- foreach my $symbol ($self->list_all_package_symbols('CODE')) {
+ my %all_code = $self->get_all_package_symbols('CODE');
- my $code = $self->get_package_symbol('&' . $symbol);
+ foreach my $symbol (keys %all_code) {
+ my $code = $all_code{$symbol};
my ($pkg, $name) = Class::MOP::get_code_info($code);
next unless $self->does_role($role);
}
else {
- next if ($pkg || '') ne $role_name &&
- ($name || '') ne '__ANON__';
+ # NOTE:
+ # in 5.10 constant.pm the constants show up
+ # as being in the right package, but in pre-5.10
+ # they show up as constant::__ANON__ so we
+ # make an exception here to be sure that things
+ # work as expected in both.
+ # - SL
+ unless ($pkg eq 'constant' && $name eq '__ANON__') {
+ next if ($pkg || '') ne $role_name ||
+ (($name || '') ne '__ANON__' && ($pkg || '') ne $role_name);
+ }
}
- $map->{$symbol} = $method_metaclass->wrap($code);
+ $map->{$symbol} = $method_metaclass->wrap(
+ $code,
+ package_name => $role_name,
+ name => $name
+ );
}
return $map;
require Moose::Meta::Role::Application::RoleSummation;
require Moose::Meta::Role::Composite;
- my @roles = map { $_->[0]->meta } @role_specs;
-
- my %params;
- # how do I do this ...
+ my (@roles, %role_params);
+ while (@role_specs) {
+ my ($role, $params) = @{ splice @role_specs, 0, 1 };
+ push @roles => $role->meta;
+ next unless defined $params;
+ $role_params{$role} = $params;
+ }
my $c = Moose::Meta::Role::Composite->new(roles => \@roles);
Moose::Meta::Role::Application::RoleSummation->new(
- %params
+ role_params => \%role_params
)->apply($c);
+
return $c;
}