http://qs321.pair.com?node_id=11137354


in reply to OO Pattern Container x Elements and Method Chaining

Something like this?
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; { package Element; use Moo; has name => (is => 'ro'); has active_container => (is => 'rw'); } { package Container; use Moo; has elements => (is => 'ro', default => sub { [] }); sub add_elem { my ($self, $element) = @_; push @{ $self->elements }, $element unless grep $_ == $element, @{ $self->elements }; } sub get_elem { my ($self, $name) = @_; my $elem = (grep $_->name eq $name, @{ $self->elements })[0]; $elem->active_container($self); return $elem } } my $elem1 = 'Element'->new(name => 'one'); my ($cont1, $cont2) = map 'Container'->new, 1, 2; $cont1->add_elem($elem1); $cont2->add_elem($elem1); $cont1 == $cont1->get_elem('one')->active_container and say 'ok'; $cont2 == $cont2->get_elem('one')->active_container and say 'ok';

You should probably make some of the slots weak.

Update: Oh, I know see what the problem is. It works for chained methods *exclusively*, i.e. it doesn't work for non-chained methods.

my $e1 = $cont1->get_elem('one'); my $e2 = $cont2->get_elem('one'); $e1->active_container ne $e2->active_container or die;

For that, you need a wrapper. Maybe it's possible to overload it so it returns the wrapped element's ref when compared numerically, so $e1 == $e2 still holds?

map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]