Docopt と相性のいい(はずの) CLI ディスパッチャ書いてみた
Docopt 便利すぎてたまらんのですが、例えば git みたいなサブコマンドでいろいろな処理をするようなコマンドラインツールを書こうと思ったときに、よしなにディスパッチしてくれるモジュールがあったらいいなと思ったので書いてみました。
CLI::Dispatch::Docopt
https://github.com/bayashi/CLI-Dispatch-Docopt
使い方
例えば、my_command
というコマンドラインツールの中身が以下のようだとします。
use Docopt;
use CLI::Dispatch::Docopt;
my $opt = docopt(argv => \@ARGV);
run('MyApp::CLI' => $opt);
__END__
=head1 NAME
my_command
=head1 SYNOPSIS
my_command <sub_command> [--foo]
=cut
run 関数は CLI::Dispatch::Docopt がエクスポートしたものです。
Docopt で <sub_command>
を受け取ります。
そして、ディスパッチ先のモジュールを MyApp::CLI::Qux
として用意しておきます。
package MyApp::CLI::Qux;
use Data::Dumper;
sub run {
my ($self, $opt) = @_;
warn __PACKAGE__. " run!\n". Dumper($opt);
}
1;
んでもって、コマンドラインで my_command
を以下のように叩くと、実行されます。
$ my_command qux --foo
MyApp::CLI::Qux run!
$VAR1 = {
'<sub_command>' => 'qux',
'--foo' => bless( do{\(my $o = '1')}, 'boolean' )
};
qux というサブコマンドが、MyApp::CLI::Qux
にディスパッチされたわけですね。
まあ本当にこれだけしか仕事しないモジュールです。
どうすかね。