Provided by: libcommandable-perl_0.11-1_all bug

NAME

       "Commandable" - utilities for commandline-based programs

DESCRIPTION

       This distribution contains a collection of utilities extracted from various commandline-
       based programs I have written, in the hope of trying to find a standard base to build
       these from in future.

       Note that "commandline" does not necessarily mean "plain-text running in a terminal";
       simply that the mode of operation is that the user types a textual representation of some
       action, and the program parses this text in order to perform it. This could equally apply
       to a command input text area in a GUI program.

PROGRAM STRUCTURE

       A typical program using this distribution would have a single instance of a "finder",
       whose job is to work out the set of commands offered by the program.  Various subclasses
       of finder are provided that use different techniques to locate the individual commands,
       depending on the structure provided by the program.

       •   Commandable::Finder::SubAttributes - expects to find each command implemented as a
           subroutine within a single package. These subroutines should all have attributes that
           provide description text, and specifications of argument and option parsing. The code
           body of the subroutine is then used to implement the actual command.

       •   Commandable::Finder::MethodAttributes - a variant of the above which expects that
           commands are implemented as methods on an object instance.

       •   Commandable::Finder::Packages - expects to find each command implemented as an entire
           package, with (constant) subroutines to give the description text and argument and
           option parsing specifications. Another subroutine within the package actually
           implements the command.

       As the user requests that commands be executed, the text of each request is then wrapped
       in an instance of Commandable::Invocation. This is then passed to the finder instance to
       actually invoke a command by parsing its name, options and arguments, and run the actual
       code body.

          my $finder = Commandable::Finder::...->new( ... );

          my $cinv = Commandable::Invocation->new( $text );

          $finder->find_and_invoke( $cinv );

       The finder instance is not modified by individual invocations, and can be reused if the
       program wishes to provide some sort of multiple invocation ability; perhaps in the form of
       a REPL-like shell:

          my $finder = ...

          while( my $text = <STDIN> ) {
             $finder->find_and_invoke( Commandable::Invocation->new( $text ) );
          }

AUTHOR

       Paul Evans <leonerd@leonerd.org.uk>