Yes, a wrapper with overloaded numeric comparison seems to work:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
{ package Element;
use Moo;
has name => (is => 'ro');
}
{ package Element::Wrapped;
use Moo;
use overload
'==' => sub { $_[0]->element == $_[1]->element },
fallback => 1;
has element => (is => 'ro',
required => 1,
handles => [qw[ name ]]); # <- and any other Elem
+ent methods.
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];
my $wrap = 'Element::Wrapped'->new(element => $elem);
$wrap->active_container($self);
return $wrap
}
}
use Test2::V0;
plan 6;
my $elem1 = 'Element'->new(name => 'one');
my ($cont1, $cont2) = map 'Container'->new, 1, 2;
$cont1->add_elem($elem1);
$cont2->add_elem($elem1);
is $cont1->get_elem('one')->active_container, $cont1;
is $cont2->get_elem('one')->active_container, $cont2;
my $e1 = $cont1->get_elem('one');
my $e2 = $cont2->get_elem('one');
ok $e1->active_container != $e2->active_container;
ok $e1 == $e2;
is $e1->name, 'one';
is $e1->name, $e2->name;
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.