# Docopt と相性のいい(はずの) CLI ディスパッチャ書いてみた {{cpan: Docopt}} 便利すぎてたまらんのですが、例えば git みたいなサブコマンドでいろいろな処理をするようなコマンドラインツールを書こうと思ったときに、よしなにディスパッチしてくれるモジュールがあったらいいなと思ったので書いてみました。 ## 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 [--foo] =cut run 関数は CLI::Dispatch::Docopt がエクスポートしたものです。 Docopt で `` を受け取ります。 そして、ディスパッチ先のモジュールを `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 = { '' => 'qux', '--foo' => bless( do{\(my $o = '1')}, 'boolean' ) }; qux というサブコマンドが、`MyApp::CLI::Qux` にディスパッチされたわけですね。 まあ本当にこれだけしか仕事しないモジュールです。 どうすかね。