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