Config::Tree
============

Simple API to use configuration data, independent of its source.

Config::Any and Config::Simple were already taken.

Config::Tree is a simple module which exports (unconditionally) two
functions, CONFIG and SECRET. SECRET is simply a wrapper around CONFIG
which will (when it's written) decode the value obtained in some
fashion.

Config::Tree can be used as a standalone module accessing a global
configuration or subclassed to access application-specific
configuration.

Actual configuration data is stored in 3 global variables in either
Config::Tree's namespace or that of the module which subclasses
it. They are:

   %volatile - Updated values in memory only.
   @stack    - Zero or more loaded or tied hashes.
   %default  - Default values.

In the general case, an application would use Config::Tree as follows:

   #!/usr/bin/perl
   use Config::Tree;
   %Config::Tree::default = ( ... );

   # Loading configuration:
   my $encoded = read_text("/path/to/config.json");
   CONFIG->append(decode_json($encoded));

   # Accessing values:
   my $foo = CONFIG("foo");
   my $true = CONFIG->true("bar.baz");
   my $bingable = CONFIG->exists("bar.bing");

Any modules this application uses which also use Config::Tree will
look for their configuration values in the same place.

Library modules which need their own configuration will use
Config::Tree as follows:

   package My::Library::Config;
   use Config::Tree ':reexport'; # Almost the same as use base 'Config::Tree';
   our %default = (
       default => "values",
   );

   package My::Library::Module;
   use My::Library::Config;
   my $anything = CONFIG("whatever");

Any code which imports My::Library::Config will use the same API
exported by Config::Tree to access the %volatile, @stack and %default
in My::Library::Config.

Config::Tree subclasses may wish to override _find to modify how the
variables are scanned and how the key is decoded.

A library should normally provide any default values which are
necessary and leave loading & saving to the application using it.


Loading configuration files
---------------------------

Configuration data is loaded into a hashref, referred to as a stash,
and inserted into a stack of stashes which are searched
sequentially. An individual stash can also be a listref but that's
weird.

There are always 2 stashes hard-coded at the top (%volatile) and
bottom (%default) of the stack. Configuration data is loaded and
inserted at the top or bottom of the stack but between %volatile and
%default (ie. @stack). The contents of these variables can be obtained
with CONFIG->volatile, CONFIG->default and CONFIG->stack;

@stack is manipulated with the methods append, prepend and replace,
all of which expect 1 or more stashes as arguments to be pushed or
unshifted, or to replace entirely the current @stack.

Actually loading and parsing a file (or saving one) is not performed
by Config::Tree. Data must be pre-processed before passing it to
append/prepend/replace and serialised before saving it. A future
version of Config::Tree will include load and save functionality,
using other modules to perform the actual I/O and not depending on any
specific one of them.