Я пытался сделать это несколькими способами, но ни один из них не кажется достаточно изящным. (Мне также интересно, если 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 для массовых?