Предположим, у меня есть следующий пакет 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;
Затем я создаю два объекта и добавляю один в качестве атрибута 'NEIGHBOR' другого:
my $a = GSM::Cell->new(ID => 20021, BCCH => 1);
my $b = GSM::Cell->new(ID => 20022, BCCH => 2);
$a->NEIGHBOUR($b);
Где-то еще, например в другой процедуре атрибут BCCH $ b может быть обновлен до другого значения:
$b->BCCH(3);
Теперь, если я ссылаюсь на
$a->NEIGHBOUR->BCCH
тогда я все равно вернусь к исходному значению атрибута BCCH вместо обновленного значения.
Полагаю, разумно было бы добавить ссылку на $ b вместо самого $ b, что решило бы проблему:
$a->NEIGHBOUR(\$b);
Тем не менее, у меня есть сценарий в веб-приложении, где объект, эквивалентный $ b (тот же идентификатор), создается во множестве методов, и изменения могут быть сделаны в любом из них, что затрудняет передачу ссылок на все ваши созданные объекты.
В идеале при звонке на
my $somevar = GSM::Cell->new(ID => 20022);
, объект должен создаваться только в том случае, если объект с таким же идентификатором еще не существует.
Является ли словарь подходящим вариантом, как-то так:
$id = 20022;
my $somevar = $already_created{$id} || GSM::Cell->new(ID => $id);
или есть более аккуратные решения?