Everything works, with my uber hack of making the attribute bits a
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute.pm
CommitLineData
4dee0fd3 1package MooseX::ClassAttribute;
2
4dee0fd3 3use strict;
54a288bd 4use warnings;
4dee0fd3 5
bb70fe3a 6our $VERSION = '0.05';
0f24a39d 7our $AUTHORITY = 'cpan:DROLSKY';
8
bb70fe3a 9use Moose ();
10use Moose::Exporter;
11use MooseX::ClassAttribute::Role::Meta::Class;
a1ec1ff1 12use MooseX::ClassAttribute::Role::Meta::Attribute;
0f24a39d 13
bb70fe3a 14Moose::Exporter->setup_import_methods
15 ( with_caller => [ 'class_has' ] );
a124b299 16
0f24a39d 17
bb70fe3a 18sub init_meta
0f24a39d 19{
bb70fe3a 20 shift;
21 my %p = @_;
54a288bd 22
bb70fe3a 23 Moose->init_meta(%p);
8d655404 24
bb70fe3a 25 return
26 Moose::Util::MetaRole::apply_metaclass_roles
27 ( for_class => $p{for_class},
28 metaclass_roles => [ 'MooseX::ClassAttribute::Role::Meta::Class' ],
29 );
8d655404 30}
31
bb70fe3a 32sub class_has
8d655404 33{
bb70fe3a 34 my $caller = shift;
35 my $name = shift;
36 my %options = @_;
8d655404 37
bb70fe3a 38 my $attrs = ref $name eq 'ARRAY' ? $name : [$name];
54a288bd 39
bb70fe3a 40 Class::MOP::Class
41 ->initialize($caller)
42 ->add_class_attribute( $_, %options )
43 for @{ $attrs };
0f24a39d 44}
45
4dee0fd3 461;
47
48__END__
49
50=pod
51
52=head1 NAME
53
54a288bd 54MooseX::ClassAttribute - Declare class attributes Moose-style
4dee0fd3 55
4dee0fd3 56=head1 SYNOPSIS
57
54a288bd 58 package My::Class;
4dee0fd3 59
54a288bd 60 use Moose;
4dee0fd3 61 use MooseX::ClassAttribute;
62
54a288bd 63 class_has 'Cache' =>
64 ( is => 'rw',
65 isa => 'HashRef',
66 default => sub { {} },
67 );
68
69 __PACKAGE__->meta()->make_immutable();
ac5d97b7 70 MooseX::ClassAttribute::container_class()->meta()->make_immutable();
54a288bd 71
72 no Moose;
73 no MooseX::ClassAttribute;
74
75 # then later ...
76
77 My::Class->Cache()->{thing} = ...;
78
79
80=head1 DESCRIPTION
81
82This module allows you to declare class attributes in exactly the same
83way as you declare object attributes, except using C<class_has()>
84instead of C<has()>. It is also possible to make these attributes
85immutable (and faster) just as you can with normal Moose attributes.
86
87You can use any feature of Moose's attribute declarations, including
88overriding a parent's attributes, delegation (C<handles>), and
89attribute metaclasses, and it should just work.
90
7dc1418a 91The accessors methods for class attribute may be called on the class
92directly, or on objects of that class. Passing a class attribute to
93the constructor will not set it.
94
54a288bd 95=head1 FUNCTIONS
96
97This class exports one function when you use it, C<class_has()>. This
98works exactly like Moose's C<has()>, but it declares class attributes.
99
170db2d9 100One little nit is that if you include C<no Moose> in your class, you
54a288bd 101won't remove the C<class_has()> function. To do that you must include
102C<no MooseX::ClassAttribute> as well.
103
8d655404 104If you want to use this module to create class attributes in I<other>
105classes, you can call the C<process_class_attribute()> function like
106this:
107
108 MooseX::ClassAttribute::process_class_attribute( $package, ... );
109
110The first argument is the package which will have the class attribute,
111and the remaining arguments are the same as those passed to
112C<class_has()>.
113
54a288bd 114=head2 Implementation and Immutability
115
116Underneath the hood, this class creates one new class for each class
117which has class attributes and sets up delegating methods in the class
118for which you're creating class attributes. You don't need to worry
119about this too much, except when it comes to making a class immutable.
4dee0fd3 120
54a288bd 121Since the class attributes are not really stored in your class, you
ac5d97b7 122need to make the container class immutable as well as your own ...
4dee0fd3 123
54a288bd 124 __PACKAGE__->meta()->make_immutable();
ac5d97b7 125 MooseX::ClassAttribute::container_class()->meta()->make_immutable();
4dee0fd3 126
54a288bd 127I<This may change in the future!>
4dee0fd3 128
129=head1 AUTHOR
130
131Dave Rolsky, C<< <autarch@urth.org> >>
132
133=head1 BUGS
134
54a288bd 135Please report any bugs or feature requests to
136C<bug-moosex-classattribute@rt.cpan.org>, or through the web interface
137at L<http://rt.cpan.org>. I will be notified, and then you'll
138automatically be notified of progress on your bug as I make changes.
4dee0fd3 139
140=head1 COPYRIGHT & LICENSE
141
142Copyright 2007 Dave Rolsky, All Rights Reserved.
143
144This program is free software; you can redistribute it and/or modify
145it under the same terms as Perl itself.
146
147=cut