#!/usr/local/bin/perl
package myHash;
use Tie::Hash ;
@ISA=qw/Tie::StdHash/ ;
use vars qw/$log/ ;
$log = 'log: ';
sub TIEHASH {
my $class = shift;
my $p = shift || '';
#print "log $p ($log))\n";
$log .= "tie $p,";
return bless {}, $class ;
}
sub STORE { my ($self, $idx, $value) = @_ ;
#print "storing $idx, $value ...\n";
$log .= "store $idx,";
$self->{$idx}=$value;
return $value;}
package myObj ;
use ExtUtils::testlib;
use Class::MakeMethods::Emulator::MethodMaker
get_set => [qw/a b c/] ;
sub new
{
my $class = shift;
bless { @_ }, $class;
}
sub all { my $self = shift; return join (' ', values %{$self}) ;}
package X ;
use ExtUtils::testlib;
use Class::MakeMethods::Emulator::MethodMaker
object_tie_hash =>
[
{
slot => 'a',
tie_hash => ['myHash', "log a"],
class => ['myObj', 'a' => 'foo']
},
{
slot =>['b','c'],
tie_hash => ['myHash', "log bc"],
class => ['myObj', 'b' => 'bar']
}
],
new => 'new';
package main;
use ExtUtils::testlib;
BEGIN { unshift @INC, ( $0 =~ /\A(.*?)[\w\.]+\z/ )[0] }
use Test;
use Data::Dumper ;
my $o = new X;
TEST { 1 };
# create a hash of 2 object with default constructor arguments
TEST {$o->a(foo=> [], bar => [])} ;
#print Dumper $o ;
TEST {$o->a->{foo}->a eq 'foo'} ;
TEST {$o->a->{bar}->a eq 'foo'} ;
TEST {$o->a(foo2=> [a=> 'toto'])} ;
#print Dumper $o ;
TEST {$o->a->{foo2}->a eq 'toto'} ;
TEST {$o->b(foo2=> [a=> 'toto'])} ;
#print Dumper $o ;
TEST {$o->b->{foo2}->a eq 'toto'} ;
exit 0 ;
syntax highlighted by Code2HTML, v. 0.9.1