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