#!/usr/bin/perl use strict; use warnings; ######################################################################## package mytest; our %update; sub new{ bless({ obj=>{}, },$_[0]); } sub add { my $self=shift; my $name=shift; my $obj=$self->{obj}; if($name && !exists($obj->{$name})) { my $val=shift; $obj->{$name}=mytest::child->new($name,$val,"$self"); $update{"$self"}=1; } } sub get { my $obj=shift->{obj}; return exists($obj->{$_[0]})?$obj->{$_[0]}:undef; } sub save { my $self=shift; my %obj=%{$self->{obj}}; if(%obj && $update{"$self"}) { # save dummy for(values(%obj)) { print $_->serialized(); } delete($update{"$self"}); } } sub DESTROY{ shift()->save(); } ######################################################################## package mytest::child; sub new { my $class=shift; bless({ name => shift, val => shift, up=>shift, },$class); } sub val { my $self=shift; if(@_) { $self->{val}=shift; $mytest::update{$self->{up}}=1 if($self->{up}); } $self->{val}; } sub name{ shift()->{name}; } sub serialized { '{ '.join(', ',map{"$_ => ".$_[0]->{$_}}qw(name val))." }\n"; } ######################################################################## ######################################################################## ######################################################################## package main; use Data::Dumper; my $t=mytest->new(); $t->add(qw(test1 A)); $t->add(qw(test2 B)); $t->add(qw(test3 C)); $t->add(qw(test4 D)); print Dumper($t);