package Object; sub new { bless { _props => {}, _objs => [] }, shift }; sub add_prop { my ( $self, $prop, $value ) = @_; $self->{_props}->{$prop} = $value; } sub add_subobject { my ( $self, @obj ) = @_; push @{$self->{_objs}}, @obj; } my $base = new Object; my $sub1 = new Object; my $sub2 = new Object; my $subsub = new Object; $sub1->add_prop( sub1 => 1 ); $sub2->add_prop( sub2 => 1 ); $subsub->add_prop( deep => 1 ); $sub1->add_subobject( $subsub ); $base->add_prop( foo => 1 ); $base->add_prop( bar => 2 ); $base->add_subobject( $sub1, $sub2 ); use Data::Dumper; print Dumper $base; __DATA__ $VAR1 = bless( { '_objs' => [ bless( { '_objs' => [ bless( { '_objs' => [], '_props' => { 'deep' => 1 } }, 'Object' ) ], '_props' => { 'sub1' => 1 } }, 'Object' ), bless( { '_objs' => [], '_props' => { 'sub2' => 1 } }, 'Object' ) ], '_props' => { 'foo' => 1, 'bar' => 2 } }, 'Object' );