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