package Model; # mix in to model classes that are # implemented as blessed hashes # This is called by a View sub addDependent { my $self = shift; my $dependent = shift; my $dependents = (self->{dependents} ||= []); push @$dependents, $dependent; } # This is called by a View sub removeDependent { my $self = shift; my $dependent = shift; my $dependents = $self->{dependents} || return; @$dependents = grep { $_ != $dependent } @$dependents; } # This is called by the Model # you can pass additional data as needed sub _changed { my $self = shift; my $dependents = $self->{dependents} || return; foreach my $dependent ( @$dependents ) { $dependent->update($self, @_); } } package View; # mix in to observer classes of any kind sub update # stub: do nothing { my ($self, $model, @aspectData) = @_; }