Dispatcher module for command line interface programs
package MyApp; use base 'App::CLI'; # the DISPATCHER of your App # it's not necessary putting the dispather # on the top level of your App package main; MyApp->dispatch; # call dispather in where you want package MyApp::List; use base qw(App::CLI::Command); # any (SUB)COMMAND of your App use constant options => ( "h|help" => "help", "verbose" => "verbose", 'n|name=s' => 'name', ); use constant subcommands => qw(User Nickname type); # if you want subcommands # automatically dispatch to subcommands # when invoke $ myapp list [user|nickname|--type] # note 'type' lower case in first char # is subcommand of old genre which is deprecated sub run { my ($self, @args) = @_; print "verbose" if $self->{verbose}; my $name = $self->{name}; # get arg following long option --name if ($self->{help}) { # if $ myapp list --help or $ $ myapp list -h # just only output PODs } else { # do something when imvoking $ my app list # without subcommand and --help } } package MyApp::List::User; use base qw(App::CLI::Command); use constant options => ( "h|help" => "help", ); sub run { my ($self,@args) = @_; # code for listing user } pakcage MyApp::List::Nickname; use base qw(App::CLI::Command); use constant options => ( "sort=s" => "sort", ); sub run { my ($self,@args) = @_; # code for listing nickname } package MyApp::List::type; # old genre of subcommand could not be cascading infinitely use base qw(MyApp::List); # should inherit its parents command sub run { my ($self, @args); # run to here when invoking $ myapp list --type } package MyApp::Help; use base 'App::CLI::Command::Help'; use constant options => ( 'verbose' => 'verbose', ); sub run { my ($self, @arg) = @_; # do something $self->SUPER(@_); # App::CLI::Command::Help would output PDOs of each command }
\*(C`App::CLI\*(C' dispatches \s-1CLI\s0 (command line interface) based commands into command classes. It also supports subcommand and per-command options.
get_opt([@config], %opt_map)
give options map, process by Getopt::Long::Parser
interface of dispatcher
cmd_map($cmd)
find package name of subcommand in constant %alias
if it's finded, return ucfirst of the package name,
otherwise, return ucfirst of $cmd itself.
get_cmd($cmd, @arg)
return subcommand of first level via $ARGV[0]
App::CLI::Command Getopt::Long
Chia-liang Kao <[email protected]> Cornelius Lin <[email protected]> shelling <[email protected]>
Copyright 2005-2006 by Chia-liang Kao <[email protected]>.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
See <http://www.perl.com/perl/misc/Artistic.html>