X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FClassAttribute%2FTrait%2FAttribute.pm;fp=lib%2FMooseX%2FClassAttribute%2FTrait%2FAttribute.pm;h=01b25da5e5fd070b9e9bb53857c2e39e3e7a9710;hb=567f5231a106cccb3a1604be8a52178fe3ce7f9a;hp=435842d759bfd63a919665e92817a72c3c242e10;hpb=d7ebfe7871af833331ba23b96ce7194254470804;p=gitmo%2FMooseX-ClassAttribute.git diff --git a/lib/MooseX/ClassAttribute/Trait/Attribute.pm b/lib/MooseX/ClassAttribute/Trait/Attribute.pm index 435842d..01b25da 100644 --- a/lib/MooseX/ClassAttribute/Trait/Attribute.pm +++ b/lib/MooseX/ClassAttribute/Trait/Attribute.pm @@ -22,75 +22,36 @@ around '_process_options' => sub { return $class->$orig( $name, $options ); }; -around attach_to_class => sub { +around 'attach_to_class' => sub { my $orig = shift; my $self = shift; my $meta = shift; $self->$orig($meta); - - $self->_initialize($meta) - unless $self->is_lazy(); + $self->initialize_instance_slot($meta, $meta->name); }; -around 'detach_from_class' => sub { - my $orig = shift; - my $self = shift; - my $meta = shift; - - $self->clear_value($meta); - - $self->$orig($meta); +override set_initial_value => sub { + my ($self, $instance, $value) = @_; + $self->_set_initial_slot_value( + $self, + $instance, + $value + ); }; -sub _initialize { - my $self = shift; - my $metaclass = shift; - - if ( $self->has_default() ) { - $self->set_value( undef, $self->default() ); - } - elsif ( $self->has_builder() ) { - $self->set_value( undef, $self->_call_builder( $metaclass->name() ) ); - } -} -around 'default' => sub { - my $orig = shift; - my $self = shift; - - my $default = $self->$orig(); - - if ( $self->is_default_a_coderef() ) { - return $default->( $self->associated_class() ); - } - - return $default; +before 'detach_from_class' => sub { + shift->clear_value(shift); }; -around '_call_builder' => sub { - shift; - my $self = shift; - my $class = shift; - - my $builder = $self->builder(); - - return $class->$builder() - if $class->can( $self->builder ); - - confess( "$class does not support builder method '" - . $self->builder - . "' for attribute '" - . $self->name - . "'" ); -}; +sub set_slot_value { $_[0]->set_value($_[0], $_[3]) } around 'set_value' => sub { shift; my $self = shift; shift; # ignoring instance or class name my $value = shift; - $self->associated_class() ->set_class_attribute_value( $self->name() => $value ); }; @@ -127,7 +88,7 @@ override '_inline_instance_get' => sub { }; -override _inline_weaken_value => sub { +override '_inline_weaken_value' => sub { my $self = shift; my ($instance, $value) = @_; return unless $self->is_weak_ref;