use List::MoreUtils qw( all );
+my @Classes = qw( constructor_class destructor_class error_class );
+
sub apply_metaclass_roles {
my %options = @_;
my $for = $options{for_class};
- my $meta = _make_new_metaclass( $for, \%options );
+ my %old_classes = map { $_ => $for->meta->$_ } @Classes;
- for my $tor_class ( grep { $options{ $_ . '_roles' } }
- qw( constructor_class destructor_class ) ) {
+ my $meta = _make_new_metaclass( $for, \%options );
- my $class = _make_new_class(
- $meta->$tor_class(),
- $options{ $tor_class . '_roles' }
- );
+ for my $c (@Classes) {
+ if ( $options{ $c . '_roles' } ) {
+ my $class = _make_new_class(
+ $meta->$c(),
+ $options{ $c . '_roles' }
+ );
- $meta->$tor_class($class);
+ $meta->$c($class);
+ }
+ else {
+ $meta->$c( $old_classes{$c} );
+ }
}
return $meta;
return $existing_class unless $roles;
- my $meta = $existing_class->meta();
+ my $meta = Class::MOP::Class->initialize($existing_class);
return $existing_class
if $meta->can('does_role') && all { $meta->does_role($_) } @{$roles};
use strict;
use warnings;
-use Test::More tests => 69;
+use Test::More tests => 71;
use Moose::Util::MetaRole;
ok( My::Class10->meta()->isa('My::Meta::Class2'),
q{... and My::Class10->meta still isa(My::Meta::Class2)} );
}
+
+{
+ package My::Constructor;
+
+ use base 'Moose::Meta::Method::Constructor';
+}
+
+{
+ package My::Class11;
+
+ use Moose;
+
+ __PACKAGE__->meta->constructor_class('My::Constructor');
+
+ Moose::Util::MetaRole::apply_metaclass_roles(
+ for_class => 'My::Class11',
+ metaclass_roles => ['Role::Foo'],
+ );
+}
+
+{
+ ok( My::Class11->meta()->meta()->does_role('Role::Foo'),
+ q{My::Class11->meta()->meta() does Role::Foo } );
+ is( My::Class11->meta()->constructor_class, 'My::Constructor',
+ q{... and explicitly set constructor_class value is unchanged)} );
+}