21:16■[perl][Moose]Moose?Mooseってなんだ?あれか?整髪料か?え?Perl?最近Perl界隈ではMoose、MooseってなんかMooseってのが流行ってるらしい。完全に出遅れてしまったので増田で書き殴ってみる。自分自身のブログでは、さもずっと前からMoose知ってたかのように振舞うために、増田で先に放出しておく。プログラマ層が限りなく低い増田にこんなこと書いてもだれも見てくれない気はするけど。コードを探索して理解を深めたMooseってのは結局のところClass::MOPのラッパーみたいなもんだと。Class::MOPってのは何だ?ってことだけど、メタなんとかプログラミング?え?プロトコル?まーどっちでもいい。読んでいくとメタなんとかとか大層な名前が付いてるけど、結局のところPerlのpackageそのものの操作をオブジェクティブ扱えるようにしたものみたいだ。Foo->method;みたいな感じでかっこよく追加できるってわけさ。ま、これはほんの一例だけどな。(他にもメソッドを削除したりフックしたり色々できる。Class::MOP::Class->create('Foo');」と書ける。これの何が良いのかというと、$classというオブジェクト経由でFooパッケージを色々操作できるところにつきる。(warnings|strict)」をしたりパッケージを操作する処理っていうのはPerlのキチャナイ構文が多かったのだが、Class::MOPのおかげでスッキリ綺麗に書けるようになったってこった。次にMooseだが、これは結局のところClass::MOPのパッケージ管理の部分に+αしただけのラッパーだ。その+αってのが結構凄かったりする。Int型じゃないのでエラーMoose::Roleを使ってRubyのMixinみたいなことができたりする。実はこれらの処理ってのは本当は別に凄くもなんとも無い。アクセサ生成なんてClass::Accessorがあるし、関数の引数の型チェックなんてのもParams::Validate等昔から存在してるし、Mixinに関してはもともとPerlは多重継承できるので最初からできるし。なんでみんなMoose、Moose言ってるのかっていうと、それはやはりClass::MOPの存在が大きいであろう。綺麗且つ柔軟にパッケージの操作が出来るClass::MOPが土台にあって、今まで別々の役割として存在してきたモジュール達を統合し、よりわかりやすく、より柔軟に、そしてより強力なPerlのオブジェクト指向を構築できるようにした。それがMooseなのだ。Mooseについて調べていくうちに一つ残念に思ったことがある。オブジェクトにメソッドを追加する機構がないのだ。オブジェクトにメソッドを追加する、だ。パッケージにではなく、オブジェクトに、だ。hogeちなみに$obj->metaというのはFooパッケージを管理するClass::MOPへのアクセサだ。いうことは上記の処理はFooに対してhogeというメソッドを追加していることになる。hoge$obj_2->hogeが呼べてしまうわけだ。$obj->metaは結局のところFooパッケージなのだから、そこにメソッドを追加しているので当然の結果である。$objだけにメソッドを追加することは、Mooseではできないのだ。