X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FClassAttribute.pm;h=d3a3e63224f08545f98b15dafdae5af9afbf61f5;hb=3e505970e29109d4eef1f58f6e0275dbe10e6c64;hp=1b5a0c64f567df62710b143027096db7c8e2c29d;hpb=4dee0fd36e42cb0e22e39a652bd931197a72ccc3;p=gitmo%2FMooseX-ClassAttribute.git diff --git a/lib/MooseX/ClassAttribute.pm b/lib/MooseX/ClassAttribute.pm index 1b5a0c6..d3a3e63 100644 --- a/lib/MooseX/ClassAttribute.pm +++ b/lib/MooseX/ClassAttribute.pm @@ -1,54 +1,151 @@ package MooseX::ClassAttribute; -use warnings; use strict; +use warnings; -our $VERSION = '0.01'; - +use Moose 2.00 (); +use Moose::Exporter; +use Moose::Util; +use MooseX::ClassAttribute::Trait::Class; +use MooseX::ClassAttribute::Trait::Role; +use MooseX::ClassAttribute::Trait::Application::ToClass; +use MooseX::ClassAttribute::Trait::Application::ToRole; + +Moose::Exporter->setup_import_methods( + with_meta => ['class_has'], + class_metaroles => { + class => ['MooseX::ClassAttribute::Trait::Class'], + }, + role_metaroles => { + role => ['MooseX::ClassAttribute::Trait::Role'], + application_to_class => + ['MooseX::ClassAttribute::Trait::Application::ToClass'], + application_to_role => + ['MooseX::ClassAttribute::Trait::Application::ToRole'], + }, +); + +sub class_has { + my $meta = shift; + my $name = shift; + + my $attrs = ref $name eq 'ARRAY' ? $name : [$name]; + + my %options = ( definition_context => _caller_info(), @_ ); + + $meta->add_class_attribute( $_, %options ) for @{$attrs}; +} + +# Copied from Moose::Util in 2.06 +sub _caller_info { + my $level = @_ ? ($_[0] + 1) : 2; + my %info; + @info{qw(package file line)} = caller($level); + return \%info; +} 1; +# ABSTRACT: Declare class attributes Moose-style + __END__ =pod -=head1 NAME +=head1 SYNOPSIS -MooseX::ClassAttribute - The fantastic new MooseX::ClassAttribute! + package My::Class; + use Moose; + use MooseX::ClassAttribute; -=head1 SYNOPSIS + class_has 'Cache' => + ( is => 'rw', + isa => 'HashRef', + default => sub { {} }, + ); -Quick summary of what the module does. + __PACKAGE__->meta()->make_immutable(); -Perhaps a little code snippet. + no Moose; + no MooseX::ClassAttribute; - use MooseX::ClassAttribute; + # then later ... - my $foo = MooseX::ClassAttribute->new; + My::Class->Cache()->{thing} = ...; - ... +=head1 DESCRIPTION -=head1 METHODS +This module allows you to declare class attributes in exactly the same +way as object attributes, using C instead of C. -This class provides the following methods +You can use any feature of Moose's attribute declarations, including +overriding a parent's attributes, delegation (C), attribute traits, +etc. All features should just work. The one exception is the "required" flag, +which is not allowed for class attributes. -=head1 AUTHOR +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 that attribute. -Dave Rolsky, C<< >> +=head1 FUNCTIONS -=head1 BUGS +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. Or you can just use L +instead. + +=head2 Implementation and Immutability -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. +This module will add a role to your class's metaclass, See +L for details. This role +provides introspection methods for class attributes. -=head1 COPYRIGHT & LICENSE +Class attributes themselves do the +L role. -Copyright 2007 Dave Rolsky, All Rights Reserved. +=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 Moose's native traits. + +=head2 Class Attributes in Roles + +You can add a class attribute to a role. When that role is applied to a class, +the class will have the relevant class attributes added. Note that attribute +defaults will be calculated when the class attribute is composed into the +class. + +=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. + +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. + +To donate, log into PayPal and send money to autarch@urth.org or use +the button on this page: +L + +=head1 BUGS -This program is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. +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. =cut