私はこれをいくつかの方法で実行しようとしましたが、どれも十分に優雅に見えません。(CPAN や Moose が既にこれを持っているかどうかも疑問に思っています。私が時間をかけて行った数十回の検索では、完全に一致するものは何も示されていません。)
クラスのタイプを作成したい
- 自分自身を宛先タイプとしてロードする他のクラスの Base + Facade + Factory です。
- 「工場」は公正
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] };
- 質問: Moose はこれに対して適切な解決策を提供しますか? または、バルクのために Class::MOP に入る必要がありますか?