2011-04-28 5 views
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; 

答えて

15

はちょうどあなたのクラスでMooseX::StrictConstructorを使用します。それはすでにあなたが望むものを正確に行うメタクラスの特質です。

+0

ありがとうございました。あなたが言うように、それはまさに私が望むものです。すばらしいです! – Lumi

関連する問題