9
ムースはデフォルトで非常に寛容です。 Cucumber
というクラスを作成し、宣言されていない属性(wheels
など)をコンストラクターに渡すことができます。 Mooseはデフォルトでそれについて不平を言うことはありません。しかし、私はむしろdie
に宣言されていない属性を受け入れるよりもムースを好むかもしれません。それをどうすれば実現できますか?私はそれが可能であることを覚えているようだが、それはドキュメントでそう言われている場所を見つけることができません。宣言されていない属性が渡されると、Mooseコンストラクタを終了させる方法は?
package Gurke;
use Moose;
has color => is => 'rw', default => 'green';
no Moose;
__PACKAGE__->meta->make_immutable;
package main; # small test for the above package
use strict;
use warnings;
use Test::More;
use Test::Exception;
my $gu = Gurke->new(color => 'yellow');
ok $gu->color, 'green';
if (1) {
my $g2 = Gurke->new(wheels => 55);
ok ! exists $g2->{wheels}, 'Gurke has not accepted wheels :-)';
# But the caller might not be aware of such obstinate behaviour.
diag explain $g2;
}
else {
# This might be preferable:
dies_ok { Gurke->new(wheels => 55) } q(Gurken can't have wheels.);
}
done_testing;
さて、ここでの解決策を示す更新されたテストです:
package Gurke;
use Moose;
# By default, the constructor is liberal.
has color => is => 'rw', default => 'green';
no Moose;
__PACKAGE__->meta->make_immutable;
package Tomate;
use Moose;
# Have the Moose constructor die on being passed undeclared attributes:
use MooseX::StrictConstructor;
has color => is => 'rw', default => 'red';
no Moose;
__PACKAGE__->meta->make_immutable;
package main; # small test for the above packages
use strict;
use warnings;
use Test::More;
use Test::Exception;
my $gu = Gurke->new(color => 'yellow');
ok $gu->color, 'green';
my $g2 = Gurke->new(wheels => 55);
ok ! exists $g2->{wheels}, 'Gurke has not accepted wheels :-)';
diag 'But the caller might not be aware of such obstinate behaviour.';
diag explain $g2;
diag q(Now let's see the strict constructor in action.);
my $to = Tomate->new(color => 'blue');
diag explain $to;
dies_ok { Tomate->new(wheels => 55) } q(Tomaten can't have wheels.);
done_testing;
ありがとうございました。あなたが言うように、それはまさに私が望むものです。すばらしいです! – Lumi