☞ | ![]() ![]() |
34 |
sub direct_observers { my $self = shift; if (ref($self)) { # Get object member return $self->{$self->key} ||= []; } else { no strict 'refs'; return \@{$self->classvar}; # Get package variable } }
Eventually I got a better idea
direct_observers abstracts away the decision about where to store the observer lists
But it's still coupled tightly to the two decisions about where to store them
Why not decouple these?
sub direct_observers { my $self = shift; return ref($self) ? $self->direct_observers_object : $self->direct_observers_class; }
Then the special knowledge is encapsulated in direct_observers_object and direct_observers_class:
sub direct_observers_object { my $self = shift; return $self->{"Class::Observable::_observers"} ||= []; } sub direct_observers_class { my $class = shift; no strict 'refs'; return \@{"$class::Class_Observable_observers"}; }
☞ | ![]() |
☞ |