Mouse 0.44 released with duck_type

インターフェイスベースの型制約を元に面白いことができないかと思い,Mouse 0.44にMouse::Util::TypeConstraints::duck_typeを加えた。もっとも,Mooseにはずいぶん前から実装されているのだが。

duck_typeとは,オブジェクトが特定のメソッドを調べるかどうかをチェックする型制約である。

use Any::Moose;
use Any::Moose '::Util::Type::Constraints';
has ostream => (
  is  => 'rw',
  isa => duck_type([qw(print)]),
);
...
sub say {
  my $self = shift;
  $self->ostream->print(@_, "\n");
}

たとえば上記のように,単に特定のメソッドを持っているオブジェクトならなんでもかまわない,というケースで使用できる。ロールによる型制約よりも高速なのもうれしい*1

*1:具体的には,Moose/Mouse::PurePerlで何も型制約を課さないよりも高速である