2

MooseX::AliasesMooseX::Constructor::AllErrorsでエイリアスを使用しようとしています

ただし、この 2 つはうまく連携していないようです。次の例を検討してください。

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 に答える