ROUTE 3390

備忘録的な用途で書いていますが、どなたかの役に立つ事があれば嬉しいです。

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 も同じだろうから気を付けよう。