Лось или Мета?

Я пытался сделать это несколькими способами, но ни один из них не кажется достаточно изящным. (Мне также интересно, есть ли это уже у CPAN или Moose. Десятки поисков, которые я сделал с течением времени, не показали ничего, что полностью соответствовало бы.)

Я хочу создать тип класса, который

  • является Base + Facade + Factory для других классов, которые загружаются как целевые типы.
  • «Фабрика» — это просто Base->new( %params ), и она создает типы на основе политик, зарегистрированных отдельным подклассом.
  • Каждый подкласс знает основные сведения о домене базового класса, но я стараюсь свести его к минимуму. См. пример ниже: UnresolvedPath просто знает, что мы должны сначала проверить существование.

Очевидным примером этого являются каталоги и файлы файловой системы:

package Path;
use Moose;

...

sub BUILD { 
    my ( $self, $params ) = @_;
    my $path = $params->{path};

    my $class_name;
    foreach my $test_sub ( @tests ) { 
        $class_name = $test_sub->( $path );
        last if $class_name;
    }
    croak "No valid class for $path!" unless defined $class_name;
    $class_name->BUILD( $self, $params );
}

package Folder; 
use Moose;

extends 'Path';

use Path register => selector => sub { -d $_[0] };

sub BUILD { ... }

package UnresolvedPath; 

extends 'Path';

use Path register position => 1, selector => sub { !-e $_[0] };
  • Вопрос: Предоставляет ли Moose изящное решение этой проблемы? Или мне придется зайти в Class::MOP для большей части?

person Axeman    schedule 16.03.2009    source источник


Ответы (2)


Взгляните на http://code2.0beta.co.uk/moose/svn/MooseX-AbstractFactory/ и не стесняйтесь воровать. (Мой.)

person Penfold    schedule 16.03.2009

Если вы действительно хотите использовать шаблон Builder или Шаблон абстрактной фабрики, тогда вы можете это сделать, и ничто вас не остановит. Но, возможно, вам действительно нужна инверсия контроля / Внедрение зависимостей? Для этого вы можете проверить Bread Board

person slf    schedule 16.03.2009
comment
У меня есть закладка, и я прочитаю ее, когда будет возможность. Спасибо. - person Axeman; 17.03.2009