Создание класса контейнера в Perl (используя Moose) - PullRequest
2 голосов
/ 07 декабря 2011

Я пытаюсь создать контейнерный класс в 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);

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

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

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

Заранее спасибо за любую помощь

1 Ответ

0 голосов
/ 07 декабря 2011

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

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

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

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

...