tokuhirom's Blog

MooX::late をためす

MooX::late は Any::Moose や Moose なモジュールを Moo に移植するためのつなぎのモジュールとなってくれる存在です。

Moo では Moose の、なんか気をきかせてくれてるっぽいけど実装を複雑にしてしまう機能や、なんかつかってみたら微妙だったんじゃね? とみんなが薄々おもっているあんな機能やらが削られているので、そのへんのケアをしてくれるのが MooX::late となります。

isa => $string をつかえるようにする

Moose では

has foo => (isa => 'Str');

などと書けますが、この機能は Moo ではつかえません。

文字列でかけるのが便利なようですが、この文字列の部分のネームスペースがグローバルなのがちょっと難。

あと、この部分の実装は結構複雑になりがちです。このへんの面倒を MooX::late はみてくれます。

ただ、ここは素直に MooX::Types::MooseLike::Base をつかったほうがいいかも。

use MooX::Types::MooseLike::Base qw(:all);
has foo => (isa => Str);
has foo => (isa => Maybe[Str]);

ってなかんじで、かけます。

default => 3 をつかえるようにする

Moose は default に non-ref scalar value を指定するとそれがそのまま default value になる仕組みがはいっているのですが、それが Moo だとnon-ref scalar value をつかえないかんじになっているんです。

これにかんしては素直に sub { } でかこえばいいだけなので、かこっちゃうのがいいでしょう。

(個人的に基本的に値の auto upgrade みたいなのはあんま好きじゃない)

lazy_build => 1 がうごくようにする

これも Moo ではサポートされていません。

lazy_build is not supported; you are instead encouraged to use the is => 'lazy' option supported by Moo and MooseX::AttributeShortcuts.

ということですので、素直に is => 'lazy' つかうのがいいですね。

Exports blessed and confess functions to your namespace.

これは、どうでもいいですね。。

まとめ

基本的に MooX::late で提供されている機能は、ちょっとした手間でかきかえられるので、かきかえてしまうのがよさそう。

いったん s/Any::Moose/Moo/g して、MooX::late を追加しまくって、make test を通すようにしてから、徐々に MooX::late をはずしていく、という用法がよさそうです。