NAME
Tie::HashDefaults - Let a hash have default values
SYNOPSIS
use Tie::HashDefaults;
tie %h, 'Tie::HashDefaults', \%defaults1, \%defaults0;
DESCRIPTION
This creates a data structure which is essentially an array
of hashes; this list contains all the hashes (passed by ref)
in the argument list; but it also contains a new, internally
created, anonymous hash. This hash is used to store any
insertions into the tied hash.
Whenever a fetch (or an exists) is done on the tied hash,
the requested key is searched for in each hash in the list,
beginning with the internal "storage" hash; if it is not
found in that hash, the key is looked for in the first
default hash, then the next, and so on, until it is found in
one of them, or there are none left to search.
When an iteration (keys or each) is done on the tied hash,
the set of keys returned is the union of keys from all of
the default hashes, along with the storage hash.
For operations that alter a hash -- store, delete, clear --
the default hashes are never touched. Only the storage hash
is cleared. One effect of this is that if the tied hash is
cleared, e.g. via %h = ();, and immediately following that
an iteration is started (via keys or each), it is likely
that some keys will be returned. (Unless, of course, there
is no data in any of the given default hashes.)
Manipulating the Defaults List
The list of default hashes can be manipulated directly. To
do this, a special method on the tied object returns an
array, by reference, containing the list of default hashes.
Any changes to this array are reflected inside the
Tie::HashDefaults object. For example, to add another
defaults source that takes precedence over the others
already on the list:
unshift @{ tied(%h)->get_defaults_list }, \%new_default_source;
Or, to reverse the order in which the defaults are
consulted:
$ar = tied(%h)->get_defaults_list;
@$ar = reverse @$ar;
(Once you have the array-ref "handle" on the defaults list
array, it's good for as long as the tied object stays tied.)
NOTE: calling get_defaults_list also resets the iterator; so
don't call it within an each loop on a hash tied to this
class.
AUTHOR
jdporter@min.net (John Porter)
COPYRIGHT
This is free software. This software may be modified and
distributed under the same terms as Perl itself.