假设我定义了一个抽象的 My::Object 和具体的角色实现 My::Object::TypeA 和 My::Object::TypeB。出于可维护性的原因,我不希望有一个查看对象类型并应用角色的硬编码表。作为一个 DWIMmy 示例,我正在 My::Object 中寻找类似的内容:
has => 'id' (isa => 'Str', required => 1);
sub BUILD {
my $self = shift;
my $type = $self->lookup_type(); ## Returns 'TypeB'
{"My::Object::$type"}->meta->apply($self);
}
通过执行以下操作,让我获得一个带有 My::Object::TypeB 角色的 My::Object:
my $obj = My::Object(id = 'foo')
这会做我想做的事还是我走错了路?
编辑:我简化了太多;我不想在实例化对象时知道类型,我希望对象确定其类型并适当地应用正确的角色方法。我已经编辑了我的问题以使其更清楚。