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