use Sub::Name 'subname';
use Devel::GlobalDestruction 'in_global_destruction';
-our $VERSION = '0.79';
+our $VERSION = '0.89_01';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
use Moose::Meta::Class;
use Moose::Meta::Role::Method;
use Moose::Meta::Role::Method::Required;
-use Moose::Meta::Role::Method::Conflicted;
+use Moose::Meta::Role::Method::Conflicting;
use base 'Class::MOP::Module';
);
$META->add_attribute(
- 'conflicted_method_metaclass',
- reader => 'conflicted_method_metaclass',
- default => 'Moose::Meta::Role::Method::Conflicted',
+ 'conflicting_method_metaclass',
+ reader => 'conflicting_method_metaclass',
+ default => 'Moose::Meta::Role::Method::Conflicting',
+);
+
+$META->add_attribute(
+ 'application_to_class_class',
+ reader => 'application_to_class_class',
+ default => 'Moose::Meta::Role::Application::ToClass',
+);
+
+$META->add_attribute(
+ 'application_to_role_class',
+ reader => 'application_to_role_class',
+ default => 'Moose::Meta::Role::Application::ToRole',
+);
+
+$META->add_attribute(
+ 'application_to_instance_class',
+ reader => 'application_to_instance_class',
+ default => 'Moose::Meta::Role::Application::ToInstance',
);
## some things don't always fit, so they go here ...
sub add_attribute {
my $self = shift;
my $name = shift;
- unless ( defined $name && $name ) {
+ unless ( defined $name ) {
require Moose;
Moose->throw_error("You must provide a name for the attribute");
}
}
}
-sub add_conflicted_method {
+sub add_conflicting_method {
my $self = shift;
my $method;
$method = shift;
}
else {
- $method = $self->conflicted_method_metaclass->new(@_);
+ $method = $self->conflicting_method_metaclass->new(@_);
}
$self->add_required_methods($method);
$META->add_method("get_${modifier_type}_method_modifiers" => sub {
my ($self, $method_name) = @_;
#return () unless exists $self->$attr_reader->{$method_name};
- @{$self->$attr_reader->{$method_name}};
+ my $mm = $self->$attr_reader->{$method_name};
+ $mm ? @$mm : ();
});
$META->add_method("has_${modifier_type}_method_modifiers" => sub {
(blessed($other))
|| Moose->throw_error("You must pass in an blessed instance");
+ my $application_class;
if ($other->isa('Moose::Meta::Role')) {
- require Moose::Meta::Role::Application::ToRole;
- return Moose::Meta::Role::Application::ToRole->new(@args)->apply($self, $other);
+ $application_class = $self->application_to_role_class;
}
elsif ($other->isa('Moose::Meta::Class')) {
- require Moose::Meta::Role::Application::ToClass;
- return Moose::Meta::Role::Application::ToClass->new(@args)->apply($self, $other);
+ $application_class = $self->application_to_class_class;
}
else {
- require Moose::Meta::Role::Application::ToInstance;
- return Moose::Meta::Role::Application::ToInstance->new(@args)->apply($self, $other);
+ $application_class = $self->application_to_instance_class;
}
+
+ Class::MOP::load_class($application_class);
+ return $application_class->new(@args)->apply($self, $other);
}
sub combine {
#####################################################################
#
# has 'roles' => (
-# metaclass => 'Collection::Array',
+# metaclass => 'Array',
# reader => 'get_roles',
# isa => 'ArrayRef[Moose::Meta::Role]',
# default => sub { [] },
# );
#
# has 'excluded_roles_map' => (
-# metaclass => 'Collection::Hash',
+# metaclass => 'Hash',
# reader => 'get_excluded_roles_map',
# isa => 'HashRef[Str]',
# provides => {
# );
#
# has 'attribute_map' => (
-# metaclass => 'Collection::Hash',
+# metaclass => 'Hash',
# reader => 'get_attribute_map',
# isa => 'HashRef[Str]',
# provides => {
# );
#
# has 'required_methods' => (
-# metaclass => 'Collection::Hash',
+# metaclass => 'Hash',
# reader => 'get_required_methods_map',
# isa => 'HashRef[Moose::Meta::Role::Method::Required]',
# provides => {
# # CODE refs to apply in that order
#
# has 'before_method_modifiers' => (
-# metaclass => 'Collection::Hash',
+# metaclass => 'Hash',
# reader => 'get_before_method_modifiers_map',
# isa => 'HashRef[ArrayRef[CodeRef]]',
# provides => {
# );
#
# has 'after_method_modifiers' => (
-# metaclass => 'Collection::Hash',
+# metaclass => 'Hash',
# reader =>'get_after_method_modifiers_map',
# isa => 'HashRef[ArrayRef[CodeRef]]',
# provides => {
# );
#
# has 'around_method_modifiers' => (
-# metaclass => 'Collection::Hash',
+# metaclass => 'Hash',
# reader =>'get_around_method_modifiers_map',
# isa => 'HashRef[ArrayRef[CodeRef]]',
# provides => {
# # but instead just a single name->code mapping
#
# has 'override_method_modifiers' => (
-# metaclass => 'Collection::Hash',
+# metaclass => 'Hash',
# reader =>'get_override_method_modifiers_map',
# isa => 'HashRef[CodeRef]',
# provides => {
This method accepts a list of array references. Each array reference
should contain a role name as its first element. The second element is
-an optional hash reference. The hash reference can contain C<exclude>
-and C<alias> keys to control how methods are composed from the role.
+an optional hash reference. The hash reference can contain C<-excludes>
+and C<-alias> keys to control how methods are composed from the role.
The return value is a new L<Moose::Meta::Role::Composite> that
represents the combined roles.
Removes the named methods from the role's list of required methods.
-=item B<< $metarole->add_conflicted_method(%params) >>
+=item B<< $metarole->add_conflicting_method(%params) >>
-Instantiate the parameters as a L<Moose::Meta::Role::Method::Conflicted>
+Instantiate the parameters as a L<Moose::Meta::Role::Method::Conflicting>
object, then add it to the required method list.
=back