Add tests for introspection methods
[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();
54a288bd 70
71 no Moose;
72 no MooseX::ClassAttribute;
73
74 # then later ...
75
76 My::Class->Cache()->{thing} = ...;
77
78
79=head1 DESCRIPTION
80
81This module allows you to declare class attributes in exactly the same
169f4cc7 82way as object attributes, using C<class_has()> instead of C<has()>.
54a288bd 83
84You can use any feature of Moose's attribute declarations, including
85overriding a parent's attributes, delegation (C<handles>), and
169f4cc7 86attribute metaclasses, and it should just work. The one exception is
87the "required" flag, which is not allowed for class attributes.
54a288bd 88
169f4cc7 89The accessor methods for class attribute may be called on the class
7dc1418a 90directly, or on objects of that class. Passing a class attribute to
91the constructor will not set it.
92
54a288bd 93=head1 FUNCTIONS
94
95This class exports one function when you use it, C<class_has()>. This
96works exactly like Moose's C<has()>, but it declares class attributes.
97
170db2d9 98One little nit is that if you include C<no Moose> in your class, you
54a288bd 99won't remove the C<class_has()> function. To do that you must include
100C<no MooseX::ClassAttribute> as well.
101
102=head2 Implementation and Immutability
103
169f4cc7 104This module will add a role to your class's metaclass, See
105L<MooseX::ClassAttribute::Role::Meta::Class> for details. This role
106provides introspection methods for class attributes.
107
108Class attributes themselves do the
109L<MooseX::ClassAttribute::Role::Meta::Attribute> role.
4dee0fd3 110
169f4cc7 111There is also a L<MooseX::ClassAttribute::Meta::Method::Accessor>
112which provides part of the inlining implementation for class
113attributes.
4dee0fd3 114
169f4cc7 115=head2 Cooperation with Metaclasses and Traits
4dee0fd3 116
169f4cc7 117This module should work with most attribute metaclasses and traits,
118but it's possible that conflicts could occur. This module has been
119tested to work with C<MooseX::AttributeHelpers>.
4dee0fd3 120
121=head1 AUTHOR
122
123Dave Rolsky, C<< <autarch@urth.org> >>
124
125=head1 BUGS
126
54a288bd 127Please report any bugs or feature requests to
128C<bug-moosex-classattribute@rt.cpan.org>, or through the web interface
129at L<http://rt.cpan.org>. I will be notified, and then you'll
130automatically be notified of progress on your bug as I make changes.
4dee0fd3 131
132=head1 COPYRIGHT & LICENSE
133
169f4cc7 134Copyright 2007-2008 Dave Rolsky, All Rights Reserved.
4dee0fd3 135
136This program is free software; you can redistribute it and/or modify
137it under the same terms as Perl itself.
138
139=cut