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的なイメージがしっくりくる。