使い道がよくわからんなあ、とおもって無視していたのですが、 Perl 5.10 以後では UNIVERSAL::DOES がつかえるようになっています。具体的にはあらゆるオブジェクトで ->DOES
というメソッドがよべるようになっています。
これにより、オブジェクトがロールをサポートしているかどうかのチェックができるようになっています。
Role は isa に追加してもいいが、以下のように DOES メソッドを追加してもよい。
sub DOES {
my($c, $name) = @_;
return $name eq 'Role::SuperHero' || $c->isa($name);
}
Perl 5.10 より古い、もはやメンテナンスされていない Perl でも、変態仮面こと gfx さんによる UNIVERSAL::DOES というモジュールをつかうことにより、エミュレーションが可能です。
require UNIVERSAL::DOES
unless defined &UNIVERSAL::DOES;
これにより、あるオブジェクトがロールをサポートしているかどうかを明示的に判断できる。