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