tokuhirom's Blog

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;

これにより、あるオブジェクトがロールをサポートしているかどうかを明示的に判断できる。