UNIVERSAL::DOES の使い道
使い道がよくわからんなあ、とおもって無視していたのですが、 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;
これにより、あるオブジェクトがロールをサポートしているかどうかを明示的に判断できる。