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