Any::Moose とか幻想やったんや

Any::MooseMooseMouse のラッパーで、バックエンドがどちらになるかは use Any::Moose した時点で Moose or Mouse がロードされているかによって変わる。

どこかで use Moose していたら use Any::Mooseuse Moose としてうごくし、 そうじゃない場合は use Mouse としてうごく。

これはなんのためにあるかというと、MouseとMooseの両方のモジュールを混ぜて使うと壊れるからなんだけど、 そもそも混ぜて使って問題になるのは Mouse のクラスを Moose で extends したりとか、そういう Moose 周りの機能を相互に使おうとした場合だけであって、混ぜて使っていてもそれぞれのクラスを普通に使い合う分にはなんの問題もない。

また、昔はruntimeの速度にそこまで性能差はなかったということもある。(make_immutable してたら Moose もそこまで遅くない)

しかし現在では gfx マジックによって Mouse は激しく高速化されており、runtime での速度差もかなりある。 したがって、Moose的な意味で相互利用する場合でなければ、Any::Moose が勝手に Moose になるとうれしくない場合がほとんどだ。

さらに、MooseとMouseの非互換によって、バックエンドがMouseのときはうまく動いていたコードが、 どこからMooseモジュールを使用したことによってバックエンドがMooseに切り替わった瞬間に動かなくなるという事例もある。

結論として Any::Moose つかわないで Mouse を直で使う、で誰も困らないなーとおもってるのでそうしていこうと考えております。

もし混ぜることがあったとしても Moose からつかうときは non Moose なクラスとして扱うようにすれば別に問題ないでしょう。(僕はそもそもMoose使わないけどw)

by typester / at 2012-12-25T11:02:00 / perl / Comments(0)