我正在尝试使用MooseX::Aliases和MooseX::Constructor::AllErrors
的别名然而,这两个似乎并没有很好地融合在一起。请考虑以下示例:
package Alias
{
use Moose;
use MooseX::Aliases;
use MooseX::Constructor::AllErrors;
has foo => (
is => 'rw', isa => 'Str', required => 1, alias => 'bar'
);
}
use strict;
use warnings;
use Alias;
my $obj;
eval {
$obj = Alias->new( bar => 'alias_value' );
};
if ($@)
{
foreach my $error ( $@->errors )
{
print $error ."\n";
print $error->message ."\n";
}
exit 1;
}
print $obj->bar ."\n";
$obj->foo( 'new_alias_value' );
print $obj->foo."\n";
1;
这应该允许我使用'bar'别名创建一个Alias对象......不应该吗?有谁知道MooseX::Constructor::AllErrors
是否应支持别名属性?
答案 0 :(得分:2)
这是一个错误,因为它违反了期望,但它不容易解决 - 问题是MooseX :: Aliases修改了构造函数中允许/接受的参数,但是MooseX :: Constructor :: AllErrors不知道这样,当它在施工时查看通过的值时,如果没有“代理”字段,则会出错。
这可以通过在MooseX :: Constructor :: AllErrors看到它之前手动移动别名字段来解决这个问题:
around BUILDARGS => sub {
my $orig = shift;
my $self = shift;
my %args = @_;
$args{agency} //= delete $args{company};
$self->$orig(%args);
};
好消息是,这有希望在未来更好地运作,因为 有计划将MooseX :: Aliases作为核心,这将迫使所有其他人 扩展(例如MXCAE)以正确支持别名功能。