refactor code to allow for class attributes in roles
[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
8207dfe7 9use Moose 0.89 ();
bb70fe3a 10use Moose::Exporter;
11use MooseX::ClassAttribute::Role::Meta::Class;
0f24a39d 12
9b2bd146 13Moose::Exporter->setup_import_methods( with_meta => ['class_has'] );
a124b299 14
9b2bd146 15sub init_meta {
bb70fe3a 16 shift;
17 my %p = @_;
54a288bd 18
9b2bd146 19 return Moose::Util::MetaRole::apply_metaclass_roles(
aa639029 20 for => $p{for_class},
9b2bd146 21 class_metaroles => {
22 class => ['MooseX::ClassAttribute::Role::Meta::Class'],
23 },
deaffdd0 24 role_metaroles => {
25 role => ['MooseX::ClassAttribute::Role::Meta::Role'],
26 },
9b2bd146 27 );
8d655404 28}
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
78overriding a parent's attributes, delegation (C<handles>), and
169f4cc7 79attribute metaclasses, and it should just work. The one exception is
80the "required" flag, which 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
84the constructor will not set it.
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
170db2d9 91One little nit is that if you include C<no Moose> in your class, you
54a288bd 92won't remove the C<class_has()> function. To do that you must include
93C<no MooseX::ClassAttribute> as well.
94
95=head2 Implementation and Immutability
96
169f4cc7 97This module will add a role to your class's metaclass, See
98L<MooseX::ClassAttribute::Role::Meta::Class> for details. This role
99provides introspection methods for class attributes.
100
101Class attributes themselves do the
102L<MooseX::ClassAttribute::Role::Meta::Attribute> role.
4dee0fd3 103
169f4cc7 104There is also a L<MooseX::ClassAttribute::Meta::Method::Accessor>
105which provides part of the inlining implementation for class
106attributes.
4dee0fd3 107
169f4cc7 108=head2 Cooperation with Metaclasses and Traits
4dee0fd3 109
169f4cc7 110This module should work with most attribute metaclasses and traits,
111but it's possible that conflicts could occur. This module has been
112tested to work with C<MooseX::AttributeHelpers>.
4dee0fd3 113
7a4a3b1e 114=head1 DONATIONS
115
116If you'd like to thank me for the work I've done on this module,
117please consider making a "donation" to me via PayPal. I spend a lot of
118free time creating free software, and would appreciate any support
119you'd care to offer.
120
121Please note that B<I am not suggesting that you must do this> in order
122for me to continue working on this particular software. I will
123continue to do so, inasmuch as I have in the past, for as long as it
124interests me.
125
126Similarly, a donation made in this way will probably not make me work
127on this software much more, unless I get so many donations that I can
128consider working on free software full time, which seems unlikely at
129best.
130
131To donate, log into PayPal and send money to autarch@urth.org or use
132the button on this page:
133L<http://www.urth.org/~autarch/fs-donation.html>
134
4dee0fd3 135=head1 AUTHOR
136
137Dave Rolsky, C<< <autarch@urth.org> >>
138
139=head1 BUGS
140
54a288bd 141Please report any bugs or feature requests to
142C<bug-moosex-classattribute@rt.cpan.org>, or through the web interface
143at L<http://rt.cpan.org>. I will be notified, and then you'll
144automatically be notified of progress on your bug as I make changes.
4dee0fd3 145
146=head1 COPYRIGHT & LICENSE
147
169f4cc7 148Copyright 2007-2008 Dave Rolsky, All Rights Reserved.
4dee0fd3 149
150This program is free software; you can redistribute it and/or modify
151it under the same terms as Perl itself.
152
153=cut