NAME Getopt::Chain - Command-line processing like svn and git VERSION Version 0.015 SYNPOSIS package My::Command; use Getopt::Chain::Declare; start [qw/ verbose|v /]; # These are "global" # my-command --verbose initialize ... # my-command ? initialize ... --> my-command help initialize ... rewrite qr/^\?(.*)/ => sub { "help ".($1||'') }; # NOTE: Rewriting applies to the command sequence, NOT options # my-command about ... --> my-command help about rewrite [ ['about', 'copying'] ] => sub { "help $1" }; # my-command initialize --dir=... on initialize => [qw/ dir|d=s /], sub { my $context = shift; my $dir = $context->option( 'dir' ) # Do initialize stuff with $dir }; # my-command help on help => undef, sub { my $context = shift; # Do help stuff ... # First argument is undef because help # doesn't take any options }; under help => sub { # my-command help create # my-command help initialize on [ [ qw/create initialize/ ] ] => undef, sub { my $context = shift; # Do help for create/initialize # Both: "help create" and "help initialize" go here }; # my-command help about on 'about' => undef, sub { my $context = shift; # Help for about... }; # my-command help copying on 'copying' => undef, sub { my $context = shift; # Help for copying... }; # my-command help ... on qr/^(\S+)$/ => undef, sub { my $context = shift; my $topic = $1; # Catch-all for anything not fitting into the above... warn "I don't know about \"$topic\"\n" }; }; # ... elsewhere ... My::Command->new->run( [ @arguments ] ) My::Command->new->run # Just run with @ARGV DESCRIPTION Getopt::Chain can be used to provide svn(1)- and git(1)-style option and command processing. Any option specification covered by Getopt::Long is fair game. This is a new version of Getopt::Chain that uses Path::Dispatcher CAVEAT 1: This is pretty beta, so the sugar/interface above WILL be tweaked CAVEAT 2: Unfortunately, Getopt::Long slurps up the entire arguments array at once. Usually, this isn't a problem (as Getopt::Chain uses pass_through). However, if a subcommand has an option with the same name or alias as an option for a parent, then that option won't be available for the subcommand. For example: ./script --verbose --revision 36 edit --revision 48 --file xyzzy.c # Getopt::Chain will not associate the second --revision with "edit" So, for now, try to use distinct option names/aliases :) DEBUG: You can get some extra information about what Getopt::Chain is doing by setting the environment variable "GOC_TRACE" to 1 LEGACY The old-style, non Path::Dispatcher version is still available at Getopt::Chain::v005 SEE ALSO Getopt::Long App::Cmd MooseX::App::Cmd ACKNOWLEDGEMENTS Sartak for Path::Dispatcher obra for inspiration on the CLI (via Prophet & Sd: ) AUTHOR Robert Krimen, "" SOURCE You can contribute or fork this project via GitHub: git clone git://github.com/robertkrimen/Getopt-Chain.git Getopt-Chain BUGS Please report any bugs or feature requests to "bug-Getopt-Chain at rt.cpan.org", or through the web interface at . I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. SUPPORT You can find documentation for this module with the perldoc command. perldoc Getopt::Chain You can also look for information at: * RT: CPAN's request tracker * AnnoCPAN: Annotated CPAN documentation * CPAN Ratings * Search CPAN COPYRIGHT & LICENSE Copyright 2008 Robert Krimen, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.