はちゅにっき

こっちのブログはまったり更新

MouseX::App::Cmd があったらいいな。と思った

そもそも「Casual Perler」のさらにその手前にいる気がしている magicalhat です。

今回の記事は
CUI アプリケーションを作るときには、App::Cmd というフレームワーク (?) をよく使っています。」
というお話と
「MouseX::App::Cmd が欲しかったので挑戦してみたよ」
というお話。

App-Cmd
http://search.cpan.org/~rjbs/App-Cmd/

App::Cmd は、ひとことで言ってしまえば
「お作法にしたがってモジュールを書けば、カンタンに CUI のアプリケーションがつくれるよ!」
といったモジュールです。
個人的には CUI アプリ (?) を書くことが非常に多いので、よくお世話になっていますし、好きなモジュールのひとつでもあります。

使い方などについては、以下のスライドがすごく参考になると思います。

Writing Modular Command-line Apps with App-Cmd
http://www.slideshare.net/rjbs/writing-modular-commandline-apps-with-appcmd


で、まるっきり Pod からの売り込みですが、この App::Cmd と MooseX::Getopt をマッシュアップしたのが

MooseX-App-Cmd
http://search.cpan.org/~nuffin/MooseX-App-Cmd/

というモジュール。

以下の id:dann さんの記事でも触れられていますが *1 App::Cmd の呪文を Moose の呪文で隠蔽することができるため、結構スッキリ書けることと、既存の Moose で書いたモジュールとの相性がいいことなどから、これまたよくお世話になっているモジュールです。

MooseX-App-Cmd
http://catalyst.g.hatena.ne.jp/dann/20080503/p3


MooseX の名前を冠しているので当然 Moose を必要としますし、App::Cmd 自体、カンタンなものを書くにはあまりにも仰々しいので、利用する機会は多くはないかもしれませんが、Web アプリとかでビジネスロジックなどがそれなりにキレイに分離されていて、Moose で書いてあったりする場合には、利用してみるのも、ひとつの手としてはいいんじゃないかなぁ。と思います。


で、そうなるとどうしても Mouse 版も欲しくなっちゃって。。。
「MouseX::ほにゃらら」を作る練習になるかも?Moose / Mouse をより知るための、いい機会になるかも?
と思って、挑戦してみることにしました。

MouseX-App-Cmd
http://github.com/magicalhat/MouseX-App-Cmd

が、途中まで書いてて正直 s/Moose/Mouse/g すればそのまま動く気がしちゃいました。
むしろ、そうしなかったせいで、なにかとんでもない間違いを犯しているんじゃないかと、気が気ではありません。
特に、継承が前提となるようなモジュールで、meta_immutable をしてしまっていいんだろうか?*2
とか、そういった根本的な部分で間違っているかもしれないです。。。
Pod とかも MooseX::App::Cmd からほぼすべてコピペさせていただきました。。。
とりあえず、MooseX::App::Cmd から移植したテストが、すべてパスすることしか確認していないため、本当に使えるのかどうか分かりませんが、今後実際に自分で利用してみて、本当に正しいのかを確認していけたらなぁと思います。


MooseX::App::Cmd については、また改めて使い方をまとめて記事にしたいと思います。


そんなわけで、わーい。

*1:というか、この記事でモジュールを知ったのですが

*2:本家 MooseX::App::Cmd では meta_immutable していない