Лось или мета? - PullRequest
       8

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

6 голосов
/ 16 марта 2009

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

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

  • - это база + фабрика + фасад для других классов, которые загружаются в качестве типов назначения.
  • «Фабрика» - это просто 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 для массовых?

Ответы [ 2 ]

3 голосов
/ 16 марта 2009

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

2 голосов
/ 16 марта 2009

Если вы действительно хотите сделать Pattern Builder или Abstract Factory Pattern , тогда вы можете сделать это, и ничто не остановит вас. Но, может быть, вам действительно нужна какая-то инверсия контроля / инъекция зависимости ? Для этого вы можете оформить заказ Хлебная доска

...