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]
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.