型がクラスの時はsubtypeじゃなくてclass_typeが使える.

先週のKansai.pm #9でやったMooseプレゼンの補足です.このスライド,いろんな人に++されたりしまして,結構うれしかったYO.

で,このスライドに関して,某IRCにてアドバイスをもらったりしました.

11:44 nothingmuch: hakobe: subtype Foo as Object is better written as class_type Foo
11:44 nothingmuch: faster, too
11:45 nothingmuch: e.g. class_type "URI"; class_type "DateTime";

Thank you very much for your advice, nothingmuch.

このアドバイスによると,スライドにあった以下の型の定義は,

subtype 'URI'                                               
    => as 'Object'                                          
    => where { $_->isa('URI') };

でも良いのですが,もっと簡単に,

class_type 'URI';

と書けるらしいよ!very smart.

さらに,型のメタオブジェクトにはいろいろな機能があって,上のURI型のメタオブジェクトを取り出すと,

my $meta_class = Entry->meta;                               
my $meta_attribute = $meta_class->find_attribute_by_name('link');
my $meta_type = $meta_attribute->type_constraint;           

$meta_type->parents # URIのスーパークラスのリスト - なんかうまくいかなかった
$meta_type->class   # "URI"

といろいろ調べられるらしいです.へえええ.ほかのメソッドはMoose::Meta::TypeConstraint::Classあたりを参照.メタオブジェクトはいじりがいがありそうだなぁ.どういった場面で便利かは,まだよくわかんない.

うーむ,MOPは要勉強だな.