Moose::Role = #include directive + X
前提:Moose::RoleはJavaのInterfaceなんかじゃない
最近,RoleというのはCプリプロセッサの#includeディレクティブに近いもののような気がしてきた。そして+Xがメソッドのチェック有無やコンフリクトのチェックである。
たとえば,以下のようなコードを考えてみる。
#!perl package Say; use Any::Moose '::Role'; requires 'to_string'; sub say{ my($self) = @_; print $self->to_string, "\n"; } package MyClass; use Any::Moose; with 'Say'; has name => ( is => 'rw', isa => 'Str', ); sub to_string{ my($self) = @_; return $self->name; } package main; my $o = MyClass->new(name => 'Hello, world!'); $o->say; # => "Hello, world!\n" __END__
with 'Say'
とした時点で,#includeしたかのようにpackage Sayの中身がMyClassにコピーされ,ついでにrequiresのチェックも行われる。Moose::Roleが提供するhasやbefore, overrideも同様で,withの際に#includeしたかのように,適用先のクラスで実際のhasなどの処理を行う。
実際には#includeよりももっと多機能で安全ではあるが,実装の詳細を考えても#include的なイメージがしっくりくる。