Mouse(Moose)のRoleにはBUILDメソッドを書くべきではないんだね
下記のようなソースがあった。
Sasakure.pm
package Sasakure; use Mouse; with 'SasaRole'; __PACKAGE__->meta->make_immutable; no Mouse; 1;
SasaRole.pm
package SasaRole; use Mouse::Role; no Mouse::Role; sub BUILD { my $self = shift; warn "sasarole"; #「sasarole」 がエラーログに吐かれる } 1;
Moose初心者の僕は、Sasakure.pmでもBUILDメソッド使いたいな〜 なんて軽い気持ちで
Sasakure.pmにBUILDメソッドを追加したら、SasaRole.pmのBUILDメソッドが実行されなくなった。
Sasakure.pm
package Sasakure; use Mouse; with 'SasaRole'; __PACKAGE__->meta->make_immutable; no Mouse; sub BUILD { # 実行される my $self = shift; warn "sasakure"; #「sasakure」 がエラーログに吐かれる } 1;
SasaRole.pm
package SasaRole; use Mouse::Role; no Mouse::Role; sub BUILD { # 実行されない my $self = shift; warn "sasarole"; #「sasarole」 はエラーログに出ない } 1;
よくよく考えると、withすることでSasaRole.pmのプロパティやらメソッドはSasakure.pmに継承されている。
もちろんSasaRole.pmのBUILDメソッドも、、、
んでSasakure.pmではwithした後に、BUILDメソッドを定義している。。。
もしかして、同じメソッド名はオーバーライドされちゃうんじゃない?
上と同じだけどSasakure.pm
package Sasakure; use Mouse; with 'SasaRole'; # SasaRoleを我が一部とする もちろんBUILDメソッドも __PACKAGE__->meta->make_immutable; no Mouse; sub BUILD { # SasaRoleにもBUILDメソッドあったけど、こっちを使おうぜ my $self = shift; warn "sasakure"; #「sasakure」 がエラーログに吐かれる } 1;
ということは、そもそもRoleモジュールでBUILDメソッドは使うべきではないよね。
BUILDARGS や DEMOLISH も同じだろうから気を付けよう。