package WhiteMouse; use strict; use warnings; use constant DEFAULT_OBJECT_ARRAY_VAL => [ 0 ]; sub new { my $self = bless { %{$_[1]} }, ref($_[0]) || $_[0]; $self->init; $self } sub get { $_[0]->{$_[1]} } sub set { $_[0]->{$_[1]} = $_[2] } sub init { my $self = shift; my $ra_dim = $self->get('object_array_dim'); my $ra_val = $self->get('object_array_val') || DEFAULT_OBJECT_ARRAY_VAL; my $use_single_value = ! $#{$ra_val}; my $ra_obj = []; my $ra_p = $ra_obj; my @todo = (); my $dim_l = $#{$ra_dim}; for (my $i = 0; $i <= $dim_l; ++$i) { @{$ra_p}[0 .. $ra_dim->[$i] - 1] = map {[]} (1 .. $ra_dim->[$i]) unless $i == $dim_l; for (my $j = 0; $j < $ra_dim->[$i]; ++$j) { if ($i == $dim_l) { $ra_p->[$j] = $use_single_value ? $ra_val->[0] : shift(@$ra_val) || DEFAULT_OBJECT_ARRAY_VAL; } else { push @todo, [$ra_p->[$j], $i]; } } ($ra_p, $i) = @{shift @todo} if @todo; } $self->set(object_array => $ra_obj); }