After some experiments with a variety of Getopt modules and other stuff, I eventually got into the habit of using MooseX::App::Cmd, especially for stuff which is "just for myself", and found it to be pretty rewarding in the long run. Here are some of the points I like:
- The command / subcommand makes it easy to setup an environment (modules, configuration) of tasks which are somewhat related. Adding a new subcommand is dead easy: Just write an execute method for a Moose module.
- The command, entered by itself, provides a list of available subcommands. I tend to forget things and find this a lot better than ls -l ~/bin if I had individual scripts for every action.
- I don't write or modify my CLIs often. With MooseX::App::Cmd, parameter validation and documentation for the CLI play nicely with my usual habits for modules, whereas helpers like Getopt::Long and Getopt::Long::Descriptive are really nice but have learning curves of their own.
I'd probably hesitate, though, to use MooseX::App::Cmd for commands which are to be released with a small module or package because of its impressive list of dependencies.