SYNOPSIS

  use Hash::WithDefaults;

  %main = ( ... );
  tie %h1, 'Hash::WithDefaults', {...};
  tied(%h1)->AddDefault(\%main);
  tie %h2, 'Hash::WithDefaults', [...];
  tied(%h2)->AddDefault(\%main);

  # now if you use $h1{$key}, the value is looked up first
  # in %h1, then in %main.

DESCRIPTION

This module implements hashes that support \*(L"defaults\*(R". That is you may specify several more hashes in which the data will be looked up in case it is not found in the current hash.

Object creation

tie %hash, 'Hash::WithDefault', [$case_option], [\%values]; tie %hash, 'Hash::WithDefault', [$case_option], [\@values]; tie %hash, 'Hash::WithDefault', [$case_option], [%values];

The optional $case_option may be one of these values:

Sensitive - the hash will be case sensitive Tolower - the hash will be case sensitive, all keys are made lowercase Toupper - the hash will be case sensitive, all keys are made uppercase Preserve - the hash will be case insensitive, the case is preserved Lower - the hash will be case insensitive, all keys are made lowercase Upper - the hash will be case insensitive, all keys are made uppercase

If you pass a hash or array reference or an even list of keys and values to the tie() function, those keys and values will be \s-1COPIED\s0 to the resulting magical hash!

After you tie() the hash, you use it just like any other hash.

Functions

AddDefault

tied(%hash)->AddDefault(\%defaults);

This instructs the object to include the %defaults in the search for values. After this the value will be looked up first in %hash itself and then in %defaults.

You may keep modifying the %defaults and your changes \s-1WILL\s0 be visible through %hash!

You may add as many defaults to one Hash::WithDefaults object as you like, they will be searched in the order you add them.

If you delete a key from the tied hash, it's only deleted from the list of specific keys, the defaults are never modified through the tied hash. This means that you may get a default value for a key after you deletethe key from the tied hash!

GetDefaults

$defaults = tied(%hash)->GetDefaults(); push @$defaults, \%another_default;

Returns a reference to the array that stores the defaults. You may delete or insert hash references into the array, but make sure you \s-1NEVER\s0 \s-1EVER\s0 insert anything else than a hash reference into the array!

Config::IniHash example

use Config::IniHash; $config = ReadIni $inifile, withdefaults => 1, case => 'preserve';

if (exists $config->{':default'}) { my $default = $config->{':default'}; foreach my $section (keys %$config) { next if $section =~ /^:/; tied(%{$config->{$section}})->AddDefault($default) } }

And now all normal sections will get the default values from [:default] section ;-)

AUTHOR

Jan Krynicky <[email protected]> http://Jenda.Krynicky.cz

COPYRIGHT

Copyright (c) 2002-2009 Jan Krynicky <[email protected]>. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.