Создание класса контейнера в Perl (используя Moose)

Я пытаюсь создать контейнерный класс в Perl под названием Gene, в котором будут храниться объекты, созданные другим классом 'Cis' (например, Gene1 будет хранить Cis1a Cis1b Cis1c, а Gene2 будет хранить Cis2a Cis2b Cis2c). Это то, что я до сих пор:

package Gene;

use Moose;

has 'bindingsites'=>(
isa=>'ArrayRef[Cis]',
is=>'rw',
default=>sub{[]},


package Cis;
use Moose;

has 'gene'=>(isa=>'Gene', is=>'rw', weak_ref =>1);

Я смотрел на один из рецептов лося и пытался использовать это, но я не совсем уверен, что это то, что я ищу. Используя это, я написал что-то вроде в классе Gene:

 sub Build{
 my(&self,$params)=@_;
 foreach my $bindingsite(@{$self->bindingsites}){
   $gene->bindingsite($self)}}

но я не уверен, что это то, что мне нужно делать, и как каждый класс Gene будет знать, какие объекты Cis хранить.

Заранее благодарю за любую помощь

1 ответ

Решение

Если вы хотите, чтобы атрибут гена автоматически обновлялся при добавлении объекта Cis на места привязки класса Gene, вы можете использовать модификатор метода after после класса Gene, например.

after 'bindingsites' => sub {
    my $self = shift;
    my $bindingsites = $self->bindingsites;

    $_->gene($self) for @$bindingsites;
};

Этот саб будет запущен после звонка $gene->bindingsites(...) и будет перебирать объекты Cis, устанавливающие атрибут гена.

Другие вопросы по тегам