
CLIF::App
-------

#FIXME-DOCUMENT:Tutorial should give design guidelines for how to use
metacommands vs regular commands -- in general, an application should modify
attributes of its commands instead of commands modifying application
attributes (e.g. if a command needs a reference to an application-wide object
stored in the app object, the app's init() method should set an attribute in
the command instead of having the command be a metacommand, which holds a
reference to the application).


Future features ("coming soon"):
------
* finish command completion feature
* try to generate a usage message effectively (include aliases for each
  command, e.g. "enqueue(add,e,push): add an item to the queue")
* support generating app/command classes using import args
* include .jpg class diagrams, sequence diagrams, etc. in distribution (e.g. diagram/ directory)

* CLI::Framework::WebApp: instant web-enabled command-line applications with
automatically-generated CGIs for a web-based console -AND- custom applications
designed with parallel web and CLI interfaces
    + CLIF::App subclasses will override render() to e.g. process data
      using a template and print to STDOUT or send HTML to web server...
    + CLIF::Command::WebConsole: A Command/CGI::Application that implements a
      GUI where the bottom 1/5 of page is a textarea with an input prompt.
      CLIF::Command::WebConsole runs a loop that puts user input into @ARGV
      and calls CLIF::App::run(), which returns results.  The results are
      rendered at top of page.
    + CLIF::Application subclasses would override render() with a version that
      renders output e.g. by sending it through HTML::Template

* diagram the CLIF request sequence: parse -> [validate app options -> initialize app] -> app hook: pre-command-dispatch -> dispatch -> validate command -> ({notify master command -> dispatch} || {run})


CLIF projects
-------
    + ALICE::Operator (or "alicia") (use Moose)
    + App::GTD (use RDBO, Moose)


Tests
-------
* thoroughly test exceptions

* test using templates instead of print()ing in render; decide how best to support this use case

FIXME: How would client actually handle template
loading?  might need more features to make this automatic; this might involve
setting a template path during init(), or somehow having commands register templates
with the application, or ...

* create a test/demo CLIF Command class that can be used outside the framework of a CLIF Application (since commands can be used independently)

* test lazy-loading of commands
* test usage()

* case-sensitivity -- write a Command class with a name() method that returns uppercase; make sure that everywhere command names are produced or consumed, they are handled as they are in the name() method of the corresponding Command class.

*in tests, ensure that user has SQLite installed
