Add composition_class_roles
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute / Trait / Role.pm
1 package MooseX::ClassAttribute::Trait::Role;
2
3 use strict;
4 use warnings;
5
6 use MooseX::ClassAttribute::Meta::Role::Attribute;
7 use Scalar::Util qw( blessed );
8
9 use namespace::autoclean;
10 use Moose::Role;
11
12 with 'MooseX::ClassAttribute::Trait::Mixin::HasClassAttributes';
13
14 around add_class_attribute => sub {
15     my $orig = shift;
16     my $self = shift;
17     my $attr = (
18         blessed $_[0] && $_[0]->isa('Class::MOP::Mixin::AttributeCore')
19         ? $_[0]
20         : MooseX::ClassAttribute::Meta::Role::Attribute->new(@_)
21     );
22
23     $self->$orig($attr);
24
25     return $attr;
26 };
27
28 sub _attach_class_attribute {
29     my ( $self, $attribute ) = @_;
30
31     $attribute->attach_to_role($self);
32 }
33
34 sub composition_class_roles {
35   return 'MooseX::ClassAttribute::Trait::CompositeRole';
36 }
37
38 1;
39
40 # ABSTRACT: A trait for roles with class attributes
41
42 __END__
43
44 =pod
45
46 =head1 SYNOPSIS
47
48   for my $attr ( HasClassAttributes->meta()->get_all_class_attributes() )
49   {
50       print $attr->name();
51   }
52
53 =head1 DESCRIPTION
54
55 This role adds awareness of class attributes to a role metaclass object. It
56 provides a set of introspection methods that largely parallel the existing
57 attribute methods, except they operate on class attributes.
58
59 =head1 METHODS
60
61 Every method provided by this role has an analogous method in
62 C<Class::MOP::Class> or C<Moose::Meta::Class> for regular attributes.
63
64 =head2 $meta->has_class_attribute($name)
65
66 =head2 $meta->get_class_attribute($name)
67
68 =head2 $meta->get_class_attribute_list()
69
70 These methods are exactly like their counterparts in
71 L<MooseX::ClassAttribute::Trait::Class>.
72
73 =head2 $meta->add_class_attribute(...)
74
75 This accepts the same options as the L<Moose::Meta::Attribute>
76 C<add_attribute()> method. However, if an attribute is specified as
77 "required" an error will be thrown.
78
79 =head2 $meta->remove_class_attribute($name)
80
81 If the named class attribute exists, it is removed from the role.
82
83 =head1 BUGS
84
85 See L<MooseX::ClassAttribute> for details.
86
87 =cut