2

我正在尝试将别名与MooseX::AliasesMooseX::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应该支持别名属性?

4

1 回答 1

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)正确支持别名功能。

于 2013-06-09T17:58:48.400 回答