Update changes
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute.pm
CommitLineData
4dee0fd3 1package MooseX::ClassAttribute;
2
4dee0fd3 3use strict;
54a288bd 4use warnings;
4dee0fd3 5
88412c09 6our $VERSION = '0.11';
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
6c69490f 102One little nit is that if you include C<no Moose> in your class, you won't
103remove the C<class_has()> function. To do that you must include C<no
104MooseX::ClassAttribute> as well. Or you can just use L<namespace::autoclean>
105instead.
54a288bd 106
107=head2 Implementation and Immutability
108
169f4cc7 109This module will add a role to your class's metaclass, See
63fcc508 110L<MooseX::ClassAttribute::Trait::Class> for details. This role
169f4cc7 111provides introspection methods for class attributes.
112
113Class attributes themselves do the
63fcc508 114L<MooseX::ClassAttribute::Trait::Attribute> role.
4dee0fd3 115
169f4cc7 116There is also a L<MooseX::ClassAttribute::Meta::Method::Accessor>
117which provides part of the inlining implementation for class
118attributes.
4dee0fd3 119
169f4cc7 120=head2 Cooperation with Metaclasses and Traits
4dee0fd3 121
169f4cc7 122This module should work with most attribute metaclasses and traits,
123but it's possible that conflicts could occur. This module has been
0388e669 124tested to work with Moose's native traits.
125
126=head2 Class Attributes in Roles
127
128You can add a class attribute to a role. When that role is applied to a class,
129the class will have the relevant class attributes added. Note that attribute
130defaults will be calculated when the class attribute is composed into the
131class.
4dee0fd3 132
7a4a3b1e 133=head1 DONATIONS
134
135If you'd like to thank me for the work I've done on this module,
136please consider making a "donation" to me via PayPal. I spend a lot of
137free time creating free software, and would appreciate any support
138you'd care to offer.
139
140Please note that B<I am not suggesting that you must do this> in order
141for me to continue working on this particular software. I will
142continue to do so, inasmuch as I have in the past, for as long as it
143interests me.
144
145Similarly, a donation made in this way will probably not make me work
146on this software much more, unless I get so many donations that I can
147consider working on free software full time, which seems unlikely at
148best.
149
150To donate, log into PayPal and send money to autarch@urth.org or use
151the button on this page:
152L<http://www.urth.org/~autarch/fs-donation.html>
153
4dee0fd3 154=head1 AUTHOR
155
156Dave Rolsky, C<< <autarch@urth.org> >>
157
158=head1 BUGS
159
54a288bd 160Please report any bugs or feature requests to
161C<bug-moosex-classattribute@rt.cpan.org>, or through the web interface
162at L<http://rt.cpan.org>. I will be notified, and then you'll
163automatically be notified of progress on your bug as I make changes.
4dee0fd3 164
165=head1 COPYRIGHT & LICENSE
166
0cee5df4 167Copyright 2007-2010 Dave Rolsky, All Rights Reserved.
4dee0fd3 168
169This program is free software; you can redistribute it and/or modify
170it under the same terms as Perl itself.
171
172=cut