use strict;
use warnings;
+use Scalar::Util 'blessed';
-our $VERSION = '0.84';
+our $VERSION = '0.92';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
sub apply_metaclass_roles {
my %options = @_;
- my $for = $options{for_class};
+ my $for = blessed $options{for_class}
+ ? $options{for_class}
+ : Class::MOP::class_of($options{for_class});
- my %old_classes = map { $_ => Class::MOP::class_of($for)->$_ }
- grep { Class::MOP::class_of($for)->can($_) }
+ my %old_classes = map { $_ => $for->$_ }
+ grep { $for->can($_) }
@Classes;
my $meta = _make_new_metaclass( $for, \%options );
my $for = shift;
my $options = shift;
- return Class::MOP::class_of($for)
+ return $for
unless grep { exists $options->{ $_ . '_roles' } }
qw(
metaclass
method_metaclass
wrapped_method_metaclass
instance_metaclass
+ application_to_class_class
+ application_to_role_class
+ application_to_instance_class
+ application_role_summation_class
);
- my $old_meta = Class::MOP::class_of($for);
my $new_metaclass
- = _make_new_class( ref $old_meta, $options->{metaclass_roles} );
+ = _make_new_class( ref $for, $options->{metaclass_roles} );
# This could get called for a Moose::Meta::Role as well as a Moose::Meta::Class
my %classes = map {
- $_ => _make_new_class( $old_meta->$_(), $options->{ $_ . '_roles' } )
+ $_ => _make_new_class( $for->$_(), $options->{ $_ . '_roles' } )
}
- grep { $old_meta->can($_) }
+ grep { $for->can($_) }
qw(
attribute_metaclass
method_metaclass
wrapped_method_metaclass
instance_metaclass
+ application_to_class_class
+ application_to_role_class
+ application_to_instance_class
+ application_role_summation_class
);
return $new_metaclass->reinitialize( $for, %classes );
my $meta = Class::MOP::Class->initialize($existing_class);
return $existing_class
- if $meta->can('does_role') && all { $meta->does_role($_) } @{$roles};
+ if $meta->can('does_role') && all { $meta->does_role($_) }
+ grep { !ref $_ } @{$roles};
return Moose::Meta::Class->create_anon_class(
superclasses => $superclasses,
attributes defined yet.
The easiest way to ensure that this happens is to use
-L<Moose::Exporter> and provide an C<init_meta> method that will be
-called when imported.
+L<Moose::Exporter>, which can generate the appropriate C<init_meta>
+method for you, and make sure it is called when imported.
=head1 FUNCTIONS
=item * destructor_class_roles => \@roles
+=item * application_to_class_class_roles => \@roles
+
+=item * application_to_role_class_roles => \@roles
+
+=item * application_to_instance_class_roles => \@roles
+
These parameter all specify one or more roles to be applied to the
specified metaclass. You can pass any or all of these parameters at
once.