Modernize metarole usage
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute.pm
CommitLineData
4dee0fd3 1package MooseX::ClassAttribute;
2
4dee0fd3 3use strict;
54a288bd 4use warnings;
4dee0fd3 5
12a0d4db 6our $VERSION = '0.13';
0f24a39d 7our $AUTHORITY = 'cpan:DROLSKY';
8
6cb25e09 9use Moose 0.98 ();
bb70fe3a 10use Moose::Exporter;
63fcc508 11use MooseX::ClassAttribute::Trait::Class;
12use MooseX::ClassAttribute::Trait::Role;
13use MooseX::ClassAttribute::Trait::Application::ToClass;
14use MooseX::ClassAttribute::Trait::Application::ToRole;
0f24a39d 15
7ce5e557 16Moose::Exporter->setup_import_methods(
17 with_meta => ['class_has'],
18 class_metaroles => {
19 class => ['MooseX::ClassAttribute::Trait::Class'],
20 },
21 role_metaroles => {
22 role => ['MooseX::ClassAttribute::Trait::Role'],
23 application_to_class =>
24 ['MooseX::ClassAttribute::Trait::Application::ToClass'],
25 application_to_role =>
26 ['MooseX::ClassAttribute::Trait::Application::ToRole'],
27 },
28);
8d655404 29
9b2bd146 30sub class_has {
59ee60b4 31 my $meta = shift;
bb70fe3a 32 my $name = shift;
33 my %options = @_;
8d655404 34
bb70fe3a 35 my $attrs = ref $name eq 'ARRAY' ? $name : [$name];
54a288bd 36
9b2bd146 37 $meta->add_class_attribute( $_, %options ) for @{$attrs};
0f24a39d 38}
39
4dee0fd3 401;
41
42__END__
43
44=pod
45
46=head1 NAME
47
54a288bd 48MooseX::ClassAttribute - Declare class attributes Moose-style
4dee0fd3 49
4dee0fd3 50=head1 SYNOPSIS
51
54a288bd 52 package My::Class;
4dee0fd3 53
54a288bd 54 use Moose;
4dee0fd3 55 use MooseX::ClassAttribute;
56
54a288bd 57 class_has 'Cache' =>
58 ( is => 'rw',
59 isa => 'HashRef',
60 default => sub { {} },
61 );
62
63 __PACKAGE__->meta()->make_immutable();
54a288bd 64
65 no Moose;
66 no MooseX::ClassAttribute;
67
68 # then later ...
69
70 My::Class->Cache()->{thing} = ...;
71
54a288bd 72=head1 DESCRIPTION
73
74This module allows you to declare class attributes in exactly the same
169f4cc7 75way as object attributes, using C<class_has()> instead of C<has()>.
54a288bd 76
77You can use any feature of Moose's attribute declarations, including
0388e669 78overriding a parent's attributes, delegation (C<handles>), attribute traits,
79etc. All features should just work. The one exception is the "required" flag,
80which is not allowed for class attributes.
54a288bd 81
169f4cc7 82The accessor methods for class attribute may be called on the class
7dc1418a 83directly, or on objects of that class. Passing a class attribute to
0388e669 84the constructor will not set that attribute.
7dc1418a 85
54a288bd 86=head1 FUNCTIONS
87
88This class exports one function when you use it, C<class_has()>. This
89works exactly like Moose's C<has()>, but it declares class attributes.
90
6c69490f 91One little nit is that if you include C<no Moose> in your class, you won't
92remove the C<class_has()> function. To do that you must include C<no
93MooseX::ClassAttribute> as well. Or you can just use L<namespace::autoclean>
94instead.
54a288bd 95
96=head2 Implementation and Immutability
97
169f4cc7 98This module will add a role to your class's metaclass, See
63fcc508 99L<MooseX::ClassAttribute::Trait::Class> for details. This role
169f4cc7 100provides introspection methods for class attributes.
101
102Class attributes themselves do the
63fcc508 103L<MooseX::ClassAttribute::Trait::Attribute> role.
4dee0fd3 104
169f4cc7 105There is also a L<MooseX::ClassAttribute::Meta::Method::Accessor>
106which provides part of the inlining implementation for class
107attributes.
4dee0fd3 108
169f4cc7 109=head2 Cooperation with Metaclasses and Traits
4dee0fd3 110
169f4cc7 111This module should work with most attribute metaclasses and traits,
112but it's possible that conflicts could occur. This module has been
0388e669 113tested to work with Moose's native traits.
114
115=head2 Class Attributes in Roles
116
117You can add a class attribute to a role. When that role is applied to a class,
118the class will have the relevant class attributes added. Note that attribute
119defaults will be calculated when the class attribute is composed into the
120class.
4dee0fd3 121
7a4a3b1e 122=head1 DONATIONS
123
124If you'd like to thank me for the work I've done on this module,
125please consider making a "donation" to me via PayPal. I spend a lot of
126free time creating free software, and would appreciate any support
127you'd care to offer.
128
129Please note that B<I am not suggesting that you must do this> in order
130for me to continue working on this particular software. I will
131continue to do so, inasmuch as I have in the past, for as long as it
132interests me.
133
134Similarly, a donation made in this way will probably not make me work
135on this software much more, unless I get so many donations that I can
136consider working on free software full time, which seems unlikely at
137best.
138
139To donate, log into PayPal and send money to autarch@urth.org or use
140the button on this page:
141L<http://www.urth.org/~autarch/fs-donation.html>
142
4dee0fd3 143=head1 AUTHOR
144
145Dave Rolsky, C<< <autarch@urth.org> >>
146
147=head1 BUGS
148
54a288bd 149Please report any bugs or feature requests to
150C<bug-moosex-classattribute@rt.cpan.org>, or through the web interface
151at L<http://rt.cpan.org>. I will be notified, and then you'll
152automatically be notified of progress on your bug as I make changes.
4dee0fd3 153
154=head1 COPYRIGHT & LICENSE
155
0cee5df4 156Copyright 2007-2010 Dave Rolsky, All Rights Reserved.
4dee0fd3 157
158This program is free software; you can redistribute it and/or modify
159it under the same terms as Perl itself.
160
161=cut