1 package MooseX::ClassAttribute::Trait::Role::Composite;
6 use Moose::Util::MetaRole;
7 use Moose::Util qw(does_role);
9 use namespace::autoclean;
12 with 'MooseX::ClassAttribute::Trait::Role';
14 sub _merge_class_attributes {
18 foreach my $role ( @{ $self->get_roles() } ) {
19 if ( does_role( $role, 'MooseX::ClassAttribute::Trait::Role' ) ) {
21 map { $role->get_class_attribute($_) }
22 $role->get_class_attribute_list();
28 foreach my $attribute (@all_attributes) {
29 my $name = $attribute->name();
31 if ( exists $seen{$name} ) {
32 next if $seen{$name} == $attribute;
35 Moose->throw_error( "Role '"
37 . "' has encountered a class attribute conflict "
38 . "during composition. This is a fatal error and cannot be disambiguated."
42 $seen{$name} = $attribute;
45 foreach my $attribute (@all_attributes) {
46 $self->add_class_attribute( $attribute->clone() );
52 around apply_params => sub {
58 $self = Moose::Util::MetaRole::apply_metaroles(
61 application_to_class =>
62 ['MooseX::ClassAttribute::Trait::Application::ToClass'],
63 application_to_role =>
64 ['MooseX::ClassAttribute::Trait::Application::ToRole'],
68 $self->_merge_class_attributes();
75 # ABSTRACT: A trait that supports applying multiple roles at once
83 This trait is used to allow the application of multiple roles (one
84 or more of which contain class attributes) to a class or role.
88 See L<MooseX::ClassAttribute> for details.