X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FClassAttribute.pm;h=d05b98538b2a4da38b393d5cccb352192aa09012;hb=7a4a3b1efe4db788811154fbecbf6c94ceeee4bf;hp=3b899c38da1ec1efaf5ac47221349d0086d6522b;hpb=0f24a39d98269d89db1b902d5c763124ce5fc797;p=gitmo%2FMooseX-ClassAttribute.git diff --git a/lib/MooseX/ClassAttribute.pm b/lib/MooseX/ClassAttribute.pm index 3b899c3..d05b985 100644 --- a/lib/MooseX/ClassAttribute.pm +++ b/lib/MooseX/ClassAttribute.pm @@ -1,32 +1,47 @@ package MooseX::ClassAttribute; -use warnings; use strict; +use warnings; -our $VERSION = '0.01'; +our $VERSION = '0.05'; our $AUTHORITY = 'cpan:DROLSKY'; -use Moose; -use MooseX::ClassAttribute::Meta::Method::Accessor; +use Moose (); +use Moose::Exporter; +use MooseX::ClassAttribute::Role::Meta::Class; +use MooseX::ClassAttribute::Role::Meta::Attribute; -extends 'Moose::Meta::Attribute'; +Moose::Exporter->setup_import_methods + ( with_caller => [ 'class_has' ] ); -sub accessor_metaclass { 'MooseX::ClassAttribute::Meta::Method::Accessor' } -# This is called when an object is constructed. -sub initialize_instance_slot +sub init_meta { - return; -} + shift; + my %p = @_; + Moose->init_meta(%p); -# This is the bit of magic that lets you specify the metaclass as -# 'ClassAttribute', rather than the full name, when creating an -# attribute. -package Moose::Meta::Attribute::Custom::ClassAttribute; + return + Moose::Util::MetaRole::apply_metaclass_roles + ( for_class => $p{for_class}, + metaclass_roles => [ 'MooseX::ClassAttribute::Role::Meta::Class' ], + ); +} -sub register_implementation { 'MooseX::ClassAttribute' } +sub class_has +{ + my $caller = shift; + my $name = shift; + my %options = @_; + + my $attrs = ref $name eq 'ARRAY' ? $name : [$name]; + Class::MOP::Class + ->initialize($caller) + ->add_class_attribute( $_, %options ) + for @{ $attrs }; +} 1; @@ -36,23 +51,93 @@ __END__ =head1 NAME -MooseX::ClassAttribute - The fantastic new MooseX::ClassAttribute! +MooseX::ClassAttribute - Declare class attributes Moose-style =head1 SYNOPSIS -Quick summary of what the module does. - -Perhaps a little code snippet. + package My::Class; + use Moose; use MooseX::ClassAttribute; - my $foo = MooseX::ClassAttribute->new(); + class_has 'Cache' => + ( is => 'rw', + isa => 'HashRef', + default => sub { {} }, + ); + + __PACKAGE__->meta()->make_immutable(); + + no Moose; + no MooseX::ClassAttribute; + + # then later ... + + My::Class->Cache()->{thing} = ...; + + +=head1 DESCRIPTION + +This module allows you to declare class attributes in exactly the same +way as object attributes, using C instead of C. + +You can use any feature of Moose's attribute declarations, including +overriding a parent's attributes, delegation (C), and +attribute metaclasses, and it should just work. The one exception is +the "required" flag, which is not allowed for class attributes. + +The accessor methods for class attribute may be called on the class +directly, or on objects of that class. Passing a class attribute to +the constructor will not set it. + +=head1 FUNCTIONS + +This class exports one function when you use it, C. This +works exactly like Moose's C, but it declares class attributes. + +One little nit is that if you include C in your class, you +won't remove the C function. To do that you must include +C as well. + +=head2 Implementation and Immutability + +This module will add a role to your class's metaclass, See +L for details. This role +provides introspection methods for class attributes. + +Class attributes themselves do the +L role. + +There is also a L +which provides part of the inlining implementation for class +attributes. + +=head2 Cooperation with Metaclasses and Traits + +This module should work with most attribute metaclasses and traits, +but it's possible that conflicts could occur. This module has been +tested to work with C. + +=head1 DONATIONS + +If you'd like to thank me for the work I've done on this module, +please consider making a "donation" to me via PayPal. I spend a lot of +free time creating free software, and would appreciate any support +you'd care to offer. - ... +Please note that B in order +for me to continue working on this particular software. I will +continue to do so, inasmuch as I have in the past, for as long as it +interests me. -=head1 METHODS +Similarly, a donation made in this way will probably not make me work +on this software much more, unless I get so many donations that I can +consider working on free software full time, which seems unlikely at +best. -This class provides the following methods +To donate, log into PayPal and send money to autarch@urth.org or use +the button on this page: +L =head1 AUTHOR @@ -60,14 +145,14 @@ Dave Rolsky, C<< >> =head1 BUGS -Please report any bugs or feature requests to C, -or through the web interface at L. I will be -notified, and then you'll automatically be notified of progress on -your bug as I make changes. +Please report any bugs or feature requests to +C, or through the web interface +at L. I will be notified, and then you'll +automatically be notified of progress on your bug as I make changes. =head1 COPYRIGHT & LICENSE -Copyright 2007 Dave Rolsky, All Rights Reserved. +Copyright 2007-2008 Dave Rolsky, All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.