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