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