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