Changeset 4716

Show
Ignore:
Timestamp:
01/16/08 23:28:25 (5 years ago)
Author:
yappo
Message:

lang/perl/Class-Accessor-Lvalue-Trigger: code tidy and add tests

Location:
lang/perl/Class-Accessor-Lvalue-Trigger/trunk
Files:
4 added
3 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Class-Accessor-Lvalue-Trigger/trunk/Makefile.PL

    r4414 r4716  
    44 
    55requires $_ for (qw/ 
    6     Class::Accessor::Fast 
     6    Class::Accessor 
    77    Want 
    88/); 
  • lang/perl/Class-Accessor-Lvalue-Trigger/trunk/lib/Class/Accessor/Lvalue/Trigger.pm

    r4414 r4716  
    33use strict; 
    44use warnings; 
     5use base 'Class::Accessor'; 
     6 
    57our $VERSION = '0.01'; 
    6 use base 'Class::Accessor::Fast'; 
    78 
    8 our $TRIGGER_METHOD = 'lvalue_accessor_trigger'; 
     9our $TRIGGER_METHOD = sub { 
     10    my $self = shift; 
     11    my $name = shift; 
     12 
     13    my $last_name  = $self->{__class_accessor_lvalue_trigger_lastname}; 
     14    my $last_value = $self->{__class_accessor_lvalue_trigger_lastvalue}; 
     15 
     16    $self->set($last_name, $self->{$last_name}, $last_value, @_) if $last_name; 
     17    $self->{$name} = $self->get($name, @_); 
     18 
     19    $self->{__class_accessor_lvalue_trigger_lastname}  = $name; 
     20    $self->{__class_accessor_lvalue_trigger_lastvalue} = $self->{$name}; 
     21 
     22    $self->{$name}; 
     23}; 
     24 
     25sub set { shift->SUPER::set(@_[1..2]) } 
     26sub get { shift->SUPER::get($_[0]) } 
    927 
    1028sub make_accessor { 
    1129    my($class, $name) = @_; 
    1230 
    13     my $method = $TRIGGER_METHOD; 
    1431    return sub :lvalue { 
    1532        my $self = shift; 
    16         if (ref $method eq 'CODE') { 
    17             $method->($self, $name, 'rw', @_); 
    18         } elsif ($self->can($method)) { 
    19             $self->$method($name, 'rw', @_); 
     33        if (ref $TRIGGER_METHOD) { 
     34            $TRIGGER_METHOD->($self, $name, 'rw', @_) if  ref $TRIGGER_METHOD eq 'CODE' 
     35        } elsif (defined $TRIGGER_METHOD) { 
     36            $self->$TRIGGER_METHOD($name, 'rw', @_); 
    2037        } 
    2138        $self->{$name}; 
     
    2744    require Want; 
    2845 
    29     my $method = $TRIGGER_METHOD; 
    3046    return sub :lvalue { 
    3147        my $self = shift; 
     
    3349            my $caller = caller; 
    3450            require Carp; 
    35             Carp::croak("'$caller' cannot alter the value of '$name' on ". 
     51            Carp::croak("'$caller' cannot alter the value of '$name' on ". 
    3652                          "objects of class '$class'"); 
    3753        } 
    38         if (ref $method eq 'CODE') { 
    39             $method->($self, $name, 'ro', @_); 
    40         } elsif ($self->can($method)) { 
    41             $self->$method($name, 'ro', @_); 
     54        if (ref $TRIGGER_METHOD) { 
     55            $TRIGGER_METHOD->($self, $name, 'ro', @_) if  ref $TRIGGER_METHOD eq 'CODE' 
     56        } elsif (defined $TRIGGER_METHOD) { 
     57            $self->$TRIGGER_METHOD($name, 'ro', @_); 
    4258        } 
    4359        return $self->{$name}; 
     
    4965    require Want; 
    5066 
    51     my $method = $TRIGGER_METHOD; 
    5267    return sub :lvalue { 
    5368        my $self = shift; 
     
    5570            my $caller = caller; 
    5671            require Carp; 
    57             Carp::croak("'$caller' cannot access the value of '$name' on ". 
     72            Carp::croak("'$caller' cannot access the value of '$name' on ". 
    5873                          "objects of class '$class'"); 
    5974        } 
    60         if (ref $method eq 'CODE') { 
    61             $method->($self, $name, 'wo', @_); 
    62         } elsif ($self->can($method)) { 
    63             $self->$method($name, 'ro', @_); 
     75        if (ref $TRIGGER_METHOD) { 
     76            $TRIGGER_METHOD->($self, $name, 'wo', @_) if  ref $TRIGGER_METHOD eq 'CODE' 
     77        } elsif (defined $TRIGGER_METHOD) { 
     78            $self->$TRIGGER_METHOD($name, 'wo', @_); 
    6479        } 
    6580        $self->{$name}; 
  • lang/perl/Class-Accessor-Lvalue-Trigger/trunk/t/01_simple.t

    r4414 r4716  
    22use strict; 
    33use warnings; 
    4 use base 't::MyClassBase'; 
    5 __PACKAGE__->mk_accessors(qw/ a /); 
     4use base 'Class::Accessor::Lvalue::Trigger'; 
     5__PACKAGE__->mk_accessors(qw/ a b c /); 
    66 
    77package main; 
     
    1414isa_ok $obj, 'Class::Accessor::Lvalue::Trigger'; 
    1515 
     16$obj->c = 0; 
     17 
    1618$obj->a = 'foo'; 
    1719is $obj->a, 'foo'; 
    18 is $obj->{last}, 'a'; 
    19 is $obj->{arg0}, undef; 
     20is $obj->c, 0; 
    2021 
    21 $obj->a('baz') = 'bar'; 
    22 is $obj->{last}, 'a'; 
    23 is $obj->{arg0}, 'baz'; 
    24 is $obj->a, 'bar'; 
    25 is $obj->{arg0}, undef; 
     22$obj->c++; 
     23is $obj->a, 'foo'; 
     24is $obj->c, 1; 
     25 
     26$obj->b = 'bar'; 
     27is $obj->a, 'foo'; 
     28is $obj->b, 'bar'; 
     29is $obj->c, 1; 
     30 
     31$obj->c++; 
     32is $obj->a, 'foo'; 
     33is $obj->b, 'bar'; 
     34is $obj->c, 2; 
     35 
     36$obj->a = 'baz'; 
     37is $obj->a, 'baz'; 
     38is $obj->b, 'bar'; 
     39is $obj->c, 2; 
     40 
     41$obj->c++; 
     42is $obj->a, 'baz'; 
     43is $obj->b, 'bar'; 
     44is $obj->c, 3;