1 package MooseX::ClassAttribute::Trait::CompositeRole;
6 use Moose::Util::MetaRole;
7 use Moose::Util qw(does_role);
9 use namespace::autoclean;
11 with 'MooseX::ClassAttribute::Trait::Role';
13 sub _merge_class_attributes {
17 foreach my $role ( @{ $self->get_roles } ) {
18 if ( does_role( $role, 'MooseX::ClassAttribute::Trait::Role' ) ) {
20 map { $role->get_class_attribute($_) }
21 $role->get_class_attribute_list;
27 foreach my $attribute (@all_attributes) {
28 my $name = $attribute->name;
29 if ( exists $seen{$name} ) {
30 next if $seen{$name} == $attribute;
33 Moose->throw_error( "Role '"
35 . "' has encountered a class attribute conflict "
36 . "during composition. This is fatal error and cannot be disambiguated."
39 $seen{$name} = $attribute;
41 foreach my $attribute (@all_attributes) {
42 $self->add_class_attribute( $attribute->clone() );
48 around apply_params => sub {
49 my ( $orig, $self, @args ) = @_;
51 my $metarole = Moose::Util::MetaRole::apply_metaroles(
52 for => $self->$orig(@args),
54 application_to_class =>
55 ['MooseX::ClassAttribute::Trait::Application::ToClass'],
56 application_to_role =>
57 ['MooseX::ClassAttribute::Trait::Application::ToRole'],
60 $metarole->_merge_class_attributes;
66 # ABSTRACT: A trait that supports applying multiple roles at once
74 This trait is used to allow the application of multiple roles (one
75 or more of which contain class attributes) to a class or role.
79 See L<MooseX::ClassAttribute> for details.