次のMooseパッケージがあるとします。
package GSM::Cell;
use Moose;
has 'ID' => (is => 'ro', required => 1);
has [qw(BCCH NEIGHBOUR)] => (is => 'rw', default => undef);
no Moose;
__PACKAGE__->meta->make_immutable;
1;
次に、2つのオブジェクトを作成し、一方をもう一方の「NEIGHBOUR」属性として追加します。
my $a = GSM::Cell->new(ID => 20021, BCCH => 1);
my $b = GSM::Cell->new(ID => 20022, BCCH => 2);
$a->NEIGHBOUR($b);
別の場所、たとえば別の手順で、$bのBCCH属性を別の値に更新できます。
$b->BCCH(3);
さて、私が言及すると
$a->NEIGHBOUR->BCCH
その後、更新された値ではなく、BCCH属性の初期値が返されます。
賢明なことは、問題を解決する$b自体ではなく$bへの参照を追加することだと思います。
$a->NEIGHBOUR(\$b);
ただし、$ b(同じID)に相当するオブジェクトが多数のメソッドでインスタンス化され、いずれか1つで変更を行うことができるため、作成したすべてのオブジェクトの参照を渡すことが困難なWebアプリケーションのシナリオがあります。
理想的には、
my $somevar = GSM::Cell->new(ID => 20022);
が作成された場合、同じIDを持つオブジェクトがまだ存在しない場合にのみオブジェクトを作成する必要があります。
辞書は次のようなものです。
$id = 20022;
my $somevar = $already_created{$id} || GSM::Cell->new(ID => $id);
またはより良い解決策はありますか?