Perl MooseX::类型强制和$self

Perl MooseX::类型强制和$self,perl,moose,moosex-types,Perl,Moose,Moosex Types,有没有办法让$self进入MooseX::Types强制?我在对象中有其他数据,我想使用这些数据将强制从字符串播种到对象。或者,是否有类似于Class::MOP的初始值设定项的东西允许我这样做——它必须在类型检查之前启动 请求的伪代码: with 'DBHandle'; has 'database' => ( isa => 'Str', is => 'ro', default => 'Db' ); has 'schema' => ( isa => 'Str',

有没有办法让
$self
进入
MooseX::Types
强制?我在对象中有其他数据,我想使用这些数据将强制从
字符串
播种到
对象
。或者,是否有类似于
Class::MOP
初始值设定项
的东西允许我这样做——它必须在类型检查之前启动

请求的伪代码:

with 'DBHandle';
has 'database' => ( isa => 'Str', is => 'ro', default => 'Db' );
has 'schema' => ( isa => 'Str', is => 'ro', default => 'schema' );
has 'table' => ( isa => 'Str', is => 'ro', default => 'column );

has 'columns' => ( isa => DBCols, is => 'ro', default => sub {[qw/foo bar baz/]} );
这里,我希望“columns”强制使用
DBCols
——一个DBCol(对象)的ArrayRef——需要使用类中的
catalog
schema
col
属性,并使用
DBHandle
提供的dbh/singleton

为了减少这种假象,实际情况只是稍微复杂一点。我可以用
左右的
来完成上面的工作,现在我想做的是创建一个属性trait,该属性trait允许使用以下语法:

has 'column_id' => (
  isa => Int
  , is => 'ro'
  , traits => ['DBKey']
  , default => 5
  , column => 'foo'
);

如果由
DBKey
提供的属性trait
强制执行
DBCol
的方式与上述
相同:这需要能够访问类
数据库
模式
,同样的,dbh的单例。这很好,但是强制是真正设计为全局的,还没有人编写过“上下文相关强制”,因为没有人真正确定如何编写。(实际上,s/constrations/type constraints/--只要说“这个Str必须是一个有效的列名,定义为这个对象的
HashRef”中的一个条目,就很有用了。)


人们通常使用
和/或
BUILD
BUILDARGS

来解决这个问题。你能举一个伪代码的例子来说明你的意思吗?用伪代码更新实际上,这与我想做的非常接近。我只是找不到一个像样的方法,我想。这是每个人都想做的。因为它的基本假设,在当前的类型约束系统中,AFAIK是无法实现的。我接受了这一点——我认为“你不能”这一次是对的,不管它多么令人沮丧。