App::Cmd::Setup is a helper library, used to set up base classes that will be used as part of an App::Cmd
program. For the most part you should refer to the tutorial for how you should use this library.
This class is useful in three scenarios:
when writing your App::Cmd subclass
Instead of writing:
package MyApp;
use parent 'App::Cmd';
...you can write:
package MyApp;
use App::Cmd::Setup -app;
The benefits of doing this are mostly minor, and relate to sanity-checking your class. The
significant benefit is that this form allows you to specify plugins, as in:
package MyApp;
use App::Cmd::Setup -app => { plugins => [ 'Prompt' ] };
Plugins are described in App::Cmd::Tutorial.
Doing this also allows you to override the default configuration passed to Getopt::Long. By default,
this configuration includes "pass_through", which allows subdispatch to work correctly. If you are
not using subdispatch, and want your command to exit on unknown options, you can say:
package MyApp;
use App::Cmd::Setup -app => { getopt_conf => [] };
when writing abstract base classes for commands
That is: when you write a subclass of App::Cmd::Command that is intended for other commands to use as
their base class, you should use App::Cmd::Setup. For example, if you want all the commands in MyApp
to inherit from MyApp::Command, you may want to write that package like this:
package MyApp::Command;
use App::Cmd::Setup -command;
Do not confuse this with the way you will write specific commands:
package MyApp::Command::mycmd;
use MyApp -command;
Again, this form mostly performs some validation and setup behind the scenes for you. You can use
"base" if you prefer.
when writing App::Cmd plugins
App::Cmd::Plugin is a mechanism that allows an App::Cmd class to inject code into all its command
classes, providing them with utility routines.
To write a plugin, you must use App::Cmd::Setup. As seen above, you must also use App::Cmd::Setup to
set up your App::Cmd subclass if you wish to consume plugins.
For more information on writing plugins, see App::Cmd::Manual and App::Cmd::Plugin.