X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FClassAttribute.pm;h=bbc58aea24f6720eba2ca7ed4ae39b82c5d2261d;hb=3d3d1cd7318e9f0ab7dd183ca6a6ac10a85d1756;hp=ba5e4bbfbaadf72080eb788a98b110995486c273;hpb=bb70fe3ad64b3a6061784a338ead11df88eb9367;p=gitmo%2FMooseX-ClassAttribute.git diff --git a/lib/MooseX/ClassAttribute.pm b/lib/MooseX/ClassAttribute.pm index ba5e4bb..bbc58ae 100644 --- a/lib/MooseX/ClassAttribute.pm +++ b/lib/MooseX/ClassAttribute.pm @@ -3,55 +3,60 @@ package MooseX::ClassAttribute; use strict; use warnings; -our $VERSION = '0.05'; -our $AUTHORITY = 'cpan:DROLSKY'; +# This module doesn't really need these pragmas - this is just for the benefit +# of prereq scanning. +use namespace::clean 0.20 (); +use namespace::autoclean 0.11 (); -use Moose (); +use Moose 2.00 (); use Moose::Exporter; -use MooseX::ClassAttribute::Role::Meta::Class; +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; -Moose::Exporter->setup_import_methods - ( with_caller => [ 'class_has' ] ); - - -sub init_meta -{ - shift; - my %p = @_; + my $attrs = ref $name eq 'ARRAY' ? $name : [$name]; - Moose->init_meta(%p); + my %options = ( definition_context => _caller_info(), @_ ); - return - Moose::Util::MetaRole::apply_metaclass_roles - ( for_class => $p{for_class}, - metaclass_roles => [ 'MooseX::ClassAttribute::Role::Meta::Class' ], - ); + $meta->add_class_attribute( $_, %options ) for @{$attrs}; } -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 }; +# 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 - -MooseX::ClassAttribute - Declare class attributes Moose-style - =head1 SYNOPSIS package My::Class; @@ -66,7 +71,6 @@ MooseX::ClassAttribute - Declare class attributes Moose-style ); __PACKAGE__->meta()->make_immutable(); - MooseX::ClassAttribute::container_class()->meta()->make_immutable(); no Moose; no MooseX::ClassAttribute; @@ -75,59 +79,72 @@ MooseX::ClassAttribute - Declare class attributes Moose-style My::Class->Cache()->{thing} = ...; - =head1 DESCRIPTION This module allows you to declare class attributes in exactly the same -way as you declare object attributes, except using C -instead of C. It is also possible to make these attributes -immutable (and faster) just as you can with normal Moose attributes. +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. +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. -The accessors methods for class attribute may be called on the class +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. +the constructor will not set that attribute. =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. +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 -If you want to use this module to create class attributes in I -classes, you can call the C function like -this: +This module will add a role to your class's metaclass, See +L for details. This role +provides introspection methods for class attributes. - MooseX::ClassAttribute::process_class_attribute( $package, ... ); +Class attributes themselves do the +L role. -The first argument is the package which will have the class attribute, -and the remaining arguments are the same as those passed to -C. +=head2 Cooperation with Metaclasses and Traits -=head2 Implementation and Immutability +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. -Underneath the hood, this class creates one new class for each class -which has class attributes and sets up delegating methods in the class -for which you're creating class attributes. You don't need to worry -about this too much, except when it comes to making a class immutable. +=head2 Class Attributes in Roles -Since the class attributes are not really stored in your class, you -need to make the container class immutable as well as your own ... +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. - __PACKAGE__->meta()->make_immutable(); - MooseX::ClassAttribute::container_class()->meta()->make_immutable(); +=head1 DONATIONS -I +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. -=head1 AUTHOR +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. -Dave Rolsky, C<< >> +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 @@ -136,11 +153,4 @@ 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. - -This program is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - =cut