2017-02-04 6 views
-1

Я довольно новичок в программировании Moose и OO. Ищете какое-то руководство. У меня есть следующий Dir Муз класс, который строит список объектов File:Расширение класса Moose для внутреннего использования

#!usr/bin/perl 
package Dir; 
use Moose; 
use Modern::Perl; 

has 'files' =>   (is => 'rw', isa => 'HashRef[File]'); 

<..> 

sub BUILD { 
    my $self = shift; 

<..> 

map { $files{$_} = File->new (path => $path . '/' . $_) } @file_names; 
$self->files (\%files); 

<..> 
} 

Я пытаюсь написать новый класс MyDir что extends в Dir класс выше. Однако, вместо того чтобы создавать File объектов класса, я хочу использовать специализированные объекты, которые расширяют File объектов:

#!usr/bin/perl 
package MyDir; 
use Moose; 
use Modern::Perl; 

has 'type' => (is => 'ro', isa => 'Str', default => ''); 
has 'files' => (is => 'rw', isa => 'HashRef[MyFile]'); 

Я думаю, Moose, вероятно, имеет способ сделать это без переписывания BUILD подпрограммы, но я не уверен, как для реализации этого.

+3

Не используйте 'map' в пустом контексте , Это просто цикл 'for'. – melpomene

+0

Откуда берутся '$ path' и' @ file_names'? – melpomene

+0

'$ path' - это аргумент, переданный конструктору. '@ file_names' - это всего лишь массив имен файлов внутри каталога. Я удалил весь код, не относящийся к вопросу. – StevieD

ответ

0

я нашел хорошее решение, добавив новый атрибут:

has 'file_class' => (is => 'ro', isa => 'ClassName', default => 'File'); 

И теперь мой код, который устанавливает атрибут files это:

map { $files{$_} = $self->file_class->new (path => $path . '/' . $_) } @file_names; 
+0

Я предполагаю, что это было опущено, потому что вы все еще используете' map' в странный способ. Подход с классом в порядке, он очень расширяемый, но вы действительно должны избавиться от этой «карты» и просто сделать '$ files {$ _} = $ self-> file_class-> new (...) для @file_names; '. Это более читаемо и не использует функцию который возвращает значение в пустотном контексте. – simbabque

+0

Я сокрушен. Не знаю, как я могу продолжать жизнь. – StevieD