我一直试图通过多种方式做到这一点,但它们似乎都不够优雅. (我也想知道CPAN或Moose是否已经拥有此功能.随着时间的推移,我所做的几十次搜索都没有显示出相同的匹配.)
我想创建一种类
>是其他类的基本外观工厂,它们将自己加载为目标类型.
>“工厂”只是Base-> new(%params),它根据各个子类注册的策略创建类型.
>每个子类都知道有关Base类的域的基本知识,但我正在努力保持它的最小化.请参阅下面的示例: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] };
>问题:穆斯是否为此提供了优雅的解决方案?或者我是否必须批量进入Class :: MOP?