NAME
Commandable::Finder
- an interface for discovery of Commandable::Commands
SYNOPSIS
use Commandable::Finder::...;
my $finder = Commandable::Finder::...->new(
...
);
$finder->find_and_invoke( Commandable::Invocation->new( $text ) );
DESCRIPTION
This base class is common to the various finder subclasses:
METHODS
configure
$finder = $finder->configure( %conf );
Sets configuration options on the finder instance. Returns the finder instance itself, to permit easy chaining.
The following configuration options are recognised:
allow_multiple_commands
If enabled, the "find_and_invoke" method will permit multiple command invocations within a single call.
require_order
If enabled, stop processing options when the first non-option argument is seen.
bundling
If enabled, short (single-letter) options of simple boolean type can be combined into a single -abc...
argument. Incrementable options can be specified multiple times (as common with things like -vvv
for --verbose 3
).
add_global_options
$finder->add_global_options( @optspecs );
Since version 0.13.
Adds additional global options to the stored set.
Each is specified as a HASH reference containing keys to specify one option, in the same style as the per-command options used by Commandable::Finder::Packages.
In addition, each should also provide a key named into
, whose value should be a SCALAR or CODE reference to be used for applying the value for the option when it is parsed. SCALAR references will be assigned to directly; CODE references will be invoked with the option's name and value as positional arguments:
$$into = $value;
$into->( $name, $value );
This style permits a relatively easy upgrade from such modules as Getopt::Long, to handle global options.
GetOptions(
'verbose|v+' => \my $VERBOSE,
'silent|s' => \my $SILENT,
) or exit 1;
Can now become
$finder->add_global_options(
{ name => "verbose|v", mode => "inc", into => \my $VERBOSE,
description => "Increase verbosity of output" },
{ name => "silent|s", into => \my $SILENT,
description => "Silence output entirely" },
);
with the added benefit of automated integration with the global help
command, more consistent option parsing along with other command handling, and so on.
handle_global_options
$finder->handle_global_options( $cinv );
Since version 0.13.
Extracts global options from the command invocation and process them into the into
references previously supplied.
Normally it would not be necessary to invoke this directly, because the main "find_and_invoke" method does this anyway. It is provided in case the implementing program performs its own command handling or changes the logic in some other way.
find_commands
@commands = $finder->find_commands;
Returns a list of command instances, in no particular order. Each will be an instance of Commandable::Command.
find_command
$command = $finder->find_command( $cmdname );
Returns a command instance of the given name as an instance of Commandable::Command, or undef
if there is none.
parse_invocation
@vals = $finder->parse_invocation( $command, $cinv );
Since version 0.12.
Parses values out of a Commandable::Invocation instance according to the specification for the command's arguments. Returns a list of perl values suitable to pass into the function implementing the command.
This method will throw an exception if mandatory arguments are missing.
find_and_invoke
$result = $finder->find_and_invoke( $cinv );
A convenient wrapper around the common steps of finding a command named after the initial token in a Commandable::Invocation, parsing arguments from it, and invoking the underlying implementation function.
If the allow_multiple_commands
configuration option is set, it will repeatedly attempt to parse a command name followed by arguments and options while the invocation string is non-empty.
find_and_invoke_list
$result = $finder->find_and_invoke_list( @tokens );
A further convenience around creating a Commandable::Invocation from the given list of values and using that to invoke a command.
find_and_invoke_ARGV
$result = $finder->find_and_invoke_ARGV();
A further convenience around creating a Commandable::Invocation from the @ARGV
array and using that to invoke a command. Often this allows an entire wrapper script to be created in a single line of code:
exit Commandable::Finder::SOMESUBCLASS->new( ... )
->find_and_invoke_ARGV();
BUILTIN COMMANDS
The following built-in commands are automatically provided.
help
help
help $commandname
With no arguments, prints a summary table of known command names and their descriptive text. If any global options have been registered, these are described as well.
With a command name argument, prints more descriptive text about that command, additionally detailing the arguments and options.
The package that implements a particular command can provide more output by implementing a method called commandable_more_help
, which will take as a single argument the name of the command being printed. It should make use of the various printing methods in Commandable::Output to generate whatever extra output it wishes.
AUTHOR
Paul Evans <leonerd@leonerd.org.uk>