X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FAttribute.pm;h=5b03c7bd90bd6b47a4bfd0802b9eceef8f5c6002;hb=af72687d6d45c59be325b4d43c852606c8a2c9c1;hp=3c5e7a20ac6cd8ee65aec038f90d57fb093d10e0;hpb=45a183fb2121b112e516532a4d72edb042966580;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Attribute.pm b/lib/Class/MOP/Attribute.pm index 3c5e7a2..5b03c7b 100644 --- a/lib/Class/MOP/Attribute.pm +++ b/lib/Class/MOP/Attribute.pm @@ -9,7 +9,7 @@ use Class::MOP::Method::Accessor; use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; -our $VERSION = '0.78'; +our $VERSION = '0.85'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -77,6 +77,10 @@ sub _new { # and a list of the methods # associated with this attr 'associated_methods' => [], + # this let's us keep track of + # our order inside the associated + # class + 'insertion_order' => undef, }, $class; } @@ -163,6 +167,7 @@ sub has_builder { defined($_[0]->{'builder'}) } sub has_init_arg { defined($_[0]->{'init_arg'}) } sub has_default { defined($_[0]->{'default'}) } sub has_initializer { defined($_[0]->{'initializer'}) } +sub has_insertion_order { defined($_[0]->{'insertion_order'}) } sub accessor { $_[0]->{'accessor'} } sub reader { $_[0]->{'reader'} } @@ -173,6 +178,8 @@ sub builder { $_[0]->{'builder'} } sub init_arg { $_[0]->{'init_arg'} } sub initializer { $_[0]->{'initializer'} } sub definition_context { $_[0]->{'definition_context'} } +sub insertion_order { $_[0]->{'insertion_order'} } +sub _set_insertion_order { $_[0]->{'insertion_order'} = $_[1] } # end bootstrapped away method section. # (all methods below here are kept intact) @@ -241,7 +248,9 @@ sub get_write_method_ref { } sub is_default_a_coderef { - ('CODE' eq ref($_[0]->{'default'})) + my ($value) = $_[0]->{'default'}; + return unless ref($value); + return ref($value) eq 'CODE' || (blessed($value) && $value->isa('Class::MOP::Method')); } sub default { @@ -329,8 +338,9 @@ sub clear_value { sub accessor_metaclass { 'Class::MOP::Method::Accessor' } sub process_accessors { - warn "The process_accessors method has been made private and this public alias will be removed in a future release."; - goto &_process_accessors; + Carp::cluck('The process_accessors method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n"); + shift->_process_accessors(@_); } sub _process_accessors { @@ -494,25 +504,25 @@ C<%options> are added as key-value pairs. =over 8 -=item I +=item * init_arg This is a string value representing the expected key in an initialization hash. For instance, if we have an C value of C<-foo>, then the following code will Just Work. - MyClass->meta->construct_instance( -foo => 'Hello There' ); + MyClass->meta->new_object( -foo => 'Hello There' ); If an init_arg is not assigned, it will automatically use the attribute's name. If C is explicitly set to C, the attribute cannot be specified during initialization. -=item I +=item * builder This provides the name of a method that will be called to initialize the attribute. This method will be called on the object after it is constructed. It is expected to return a valid value for the attribute. -=item I +=item * default This can be used to provide an explicit default for initializing the attribute. If the default you provide is a subroutine reference, then @@ -562,7 +572,7 @@ Note that there is no guarantee that attributes are initialized in any particular order, so you cannot rely on the value of some other attribute when generating the default. -=item I +=item * initializer This option can be either a method name or a subroutine reference. This method will be called when setting the attribute's @@ -612,9 +622,9 @@ containing exactly one key (the method name) and one value. The value should be a subroutine reference, which will be installed as the method itself. -=over 4 +=over 8 -=item I +=item * accessor An C is a standard Perl-style read/write accessor. It will return the value of the attribute, and if a value is passed as an @@ -624,12 +634,12 @@ Note that C is a legitimate value, so this will work: $object->set_something(undef); -=item I +=item * reader This is a basic read-only accessor. It returns the value of the attribute. -=item I +=item * writer This is a basic write accessor, it accepts a single argument, and assigns that value to the attribute. @@ -638,7 +648,7 @@ Note that C is a legitimate value, so this will work: $object->set_something(undef); -=item I +=item * predicate The predicate method returns a boolean indicating whether or not the attribute has been explicitly set. @@ -646,12 +656,12 @@ attribute has been explicitly set. Note that the predicate returns true even if the attribute was set to a false value (C<0> or C). -=item I +=item * clearer This method will uninitialize the attribute. After an attribute is cleared, its C will return false. -=item I +=item * definition_context Mostly, this exists as a hook for the benefit of Moose. @@ -683,6 +693,8 @@ the constructor. =item B<< $attr->name >> +Returns the attribute's name. + =item B<< $attr->accessor >> =item B<< $attr->reader >> @@ -695,11 +707,11 @@ the constructor. The C, C, C, C, and C methods all return exactly what was passed to the constructor, so it -can be either a string containing a method name, or a hash refrence. +can be either a string containing a method name, or a hash reference. =item B<< $attr->initializer >> -Returns the intializer as passed to the constructor, so this may be +Returns the initializer as passed to the constructor, so this may be either a method name or a subroutine reference. =item B<< $attr->init_arg >> @@ -750,6 +762,11 @@ writing the attribute's value in the associated class. These methods always return a subroutine reference, regardless of whether or not the attribute is read- or write-only. +=item B<< $attr->insertion_order >> + +If this attribute has been inserted into a class, this returns a zero +based index regarding the order of insertion. + =back =head2 Informational predicates @@ -781,11 +798,15 @@ C is the default C anyway. =item B<< $attr->has_builder >> +=item B<< $attr->has_insertion_order >> + +This will be I if this attribute has not be inserted into a class + =back =head2 Value management -These methods are basically "backdoors" to the instance, and can be +These methods are basically "back doors" to the instance, and can be used to bypass the regular accessors, but still stay within the MOP. These methods are not for general use, and should only be used if you @@ -912,7 +933,7 @@ C. =over 4 -=item B<< $attr->meta >> +=item B<< Class::MOP::Attribute->meta >> This will return a L instance for this class.