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