# $Id$ # Hash tied to provide additional keys/values than the original. # Copyright (C) 2005 Jan Kratochvil # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; exactly version 2 of June 1991 is required # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA package My::Hash::Merge; our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; our $CVS_ID=q$Id$; use strict; use warnings; use My::Web; # for &Wrequire Wrequire 'My::Hash'; our @ISA=qw(My::Hash); use Carp qw(cluck confess); sub TIEHASH($@) { my($class,@parents)=@_; my $self=bless {},$class; for my $parent (@parents) { # Possibly upgrade unref("HASH")es: $parent=$class->SUPER::TIEHASH($parent)->{"parent"}; push @{$self->{"parents"}},$parent; } return $self; } sub key_find($$) { my($self,$key)=@_; my $count=0; my $first; for my $parent (@{$self->{"parents"}}) { next if !exists $parent->{$key}; $count++; $first||=$parent; } # 0 IS allowed here. cluck "Duplicity ($count-icity) for key: $key" if $count>=2; $first||=$self->{"parents"}[0]; return $first; } sub STORE($$$) { my($this,$key,$value)=@_; my $first=$this->key_find($key); $first->{$key}=$value; } sub FETCH($$) { my($this,$key)=@_; my $first=$this->key_find($key); return if !$first; return $first->{$key}; } sub FIRSTKEY($) { my($this)=@_; confess "TODO: Not yet implemented."; } sub NEXTKEY($$) { my($this,$lastkey)=@_; confess "TODO: Not yet implemented."; } sub EXISTS($$) { my($this,$key)=@_; my $first=$this->key_find($key); $first||={}; return exists $first->{$key}; } sub DELETE($$) { my($this,$key)=@_; my $first=$this->key_find($key); delete $first->{$key}; } sub CLEAR($) { my($this)=@_; confess "TODO: Not yet implemented."; } sub SCALAR { my($this)=@_; confess "TODO: Not yet implemented."; } 1;