Создание класса контейнера в 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, устанавливающие атрибут гена.