在MooseX :: Constructor :: AllErrors中使用Moose别名

时间:2013-06-07 11:00:02

标签: perl oop constructor moose

我正在尝试使用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是否应支持别名属性?

1 个答案:

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