Small formatting tweak
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute / Trait / CompositeRole.pm
CommitLineData
8a44b0a6 1package MooseX::ClassAttribute::Trait::CompositeRole;
2
3use strict;
4use warnings;
5
6use Moose::Util::MetaRole;
7use Moose::Util qw(does_role);
8
9use namespace::autoclean;
10use Moose::Role;
8dcc7909 11
8a44b0a6 12with 'MooseX::ClassAttribute::Trait::Role';
13
14sub _merge_class_attributes {
15 my $self = shift;
16
17 my @all_attributes;
535052a9 18 foreach my $role ( @{ $self->get_roles } ) {
19 if ( does_role( $role, 'MooseX::ClassAttribute::Trait::Role' ) ) {
8a44b0a6 20 push @all_attributes,
21 map { $role->get_class_attribute($_) }
22 $role->get_class_attribute_list;
23 }
24 }
25
26 my %seen;
27
28 foreach my $attribute (@all_attributes) {
29 my $name = $attribute->name;
535052a9 30 if ( exists $seen{$name} ) {
8a44b0a6 31 next if $seen{$name} == $attribute;
32
33 require Moose;
34 Moose->throw_error( "Role '"
35 . $self->name()
36 . "' has encountered a class attribute conflict "
37 . "during composition. This is fatal error and cannot be disambiguated."
38 );
39 }
40 $seen{$name} = $attribute;
41 }
42 foreach my $attribute (@all_attributes) {
43 $self->add_class_attribute( $attribute->clone() );
44 }
45
46 return keys %seen;
47}
48
49around apply_params => sub {
535052a9 50 my ( $orig, $self, @args ) = @_;
8a44b0a6 51
52 my $metarole = Moose::Util::MetaRole::apply_metaroles(
535052a9 53 for => $self->$orig(@args),
8a44b0a6 54 role_metaroles => {
55 application_to_class =>
56 ['MooseX::ClassAttribute::Trait::Application::ToClass'],
57 application_to_role =>
58 ['MooseX::ClassAttribute::Trait::Application::ToRole'],
59 },
60 );
61 $metarole->_merge_class_attributes;
62 return $metarole;
63};
64
651;
66
67# ABSTRACT: A trait that supports applying multiple roles at once
68
69__END__
70
71=pod
72
73=head1 DESCRIPTION
74
75This trait is used to allow the application of multiple roles (one
76or more of which contain class attributes) to a class or role.
77
78=head1 BUGS
79
80See L<MooseX::ClassAttribute> for details.
81
82=cut