CLI::Dispatch 0.05

ゆうべApp::Cmdの作者であるrjbs氏に呼ばれて、「いまのCLI::Dispatchだと、インストールしたあと、一部のコマンドでしか使われていない依存モジュールがバージョンアップで壊れたりすると、実際にそのコマンドを実行するまで壊れてることがわかんないよね」と指摘されたので、対策を入れてみました。

問題となるのはこんな例のとき。

package MyApp::Script::DoSomething;
use strict;
use warnings;
use Broken::Module;

sub run { ... }

1;

=head1 NAME

MyApp::Script::DoSomething - do something

=cut

CLI::Dispatchは(App::Cmdと違って/App::CLIと同じく)コマンドを実行したりコマンド一覧を表示するときには一部のコマンドが壊れていようと気にしないので、これまではBroken::Moduleの状態によらず、myapp.plを実行すれば

$ perl myapp.pl
do_something - do something

のような表示が出たのですが、0.05からは

$ perl myapp.pl
do_something - do something [disabled: compile error]

のように、なんらかの事情でコマンドを利用できない場合はきちんと一覧にその旨表示するようにしました。

compile errorというメッセージでは不親切だ、という方は、

package MyApp::Script::NotForWin;
use strict;
use warnings;

sub check {
  eval "require Module::For::Unix::Only";
  die "Unsupported OS" if $@;
}

sub run { ... }

1;

=head1 NAME

MyApp::Script::NotForWin - boo

=cut

という感じのcheckメソッドを用意すると、compile errorのかわりにダイイングメッセージが表示されるようになります(別の用途でcheckメソッドを使っていた場合は動作がおかしくなる可能性があります。すみませぬ)。