我一直试图通过多种方式做到这一点,但它们似乎都不够优雅。 (我也想知道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] };
答案 0 :(得分:3)
答案 1 :(得分:2)
如果你真的想要Builder Pattern或Abstract Factory Pattern那么你可以做到这一点,没有什么能阻止你。但也许您真正需要的是一些Inversion of Control / Dependency Injection?为此,您可以结帐Bread Board