Use with_meta rather than with_caller
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute.pm
CommitLineData
4dee0fd3 1package MooseX::ClassAttribute;
2
4dee0fd3 3use strict;
54a288bd 4use warnings;
4dee0fd3 5
8207dfe7 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
bb70fe3a 13Moose::Exporter->setup_import_methods
59ee60b4 14 ( with_meta => [ '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{
59ee60b4 33 my $meta = shift;
bb70fe3a 34 my $name = shift;
35 my %options = @_;
8d655404 36
bb70fe3a 37 my $attrs = ref $name eq 'ARRAY' ? $name : [$name];
54a288bd 38
59ee60b4 39 $meta->add_class_attribute( $_, %options )
40 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