【问题标题】:Using a Moose alias with MooseX::Constructor::AllErrors使用 Moose 别名和 MooseX::Constructor::AllErrors
【发布时间】:2013-06-07 11:00:02
【问题描述】:

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

【问题讨论】:

    标签: perl oop constructor moose


    【解决方案1】:

    这是一个错误,因为它违反了预期,但不容易解决 - 问题是 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)以正确支持别名功能。

    【讨论】:

    • 再次感谢以太。我只是试了一下,它现在的工作方式与人们期望的一样。但这与其说是解决方案,不如说是一种解决方法……在未来的版本中,这是否有可能成为 MXCAE 的默认行为?
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多