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