I'm using general style for configuring all my objects, modules, etc. This style looks like this:
$obj = MODULE->new({
param1 => $val1,
group1 => {
param2 => $val2,
param3 => $val3,
},
});
And if I need to reconfigure $obj later:
$obj->config({
group1 => {
param2 => $val5,
},
param4 => $val4,
});
I found this style very usable instead of ugly:
$obj->param1($val1);
$obj->param2($val2);
#
# Usage:
# sub config {
# my ($self, $config) = (shift, @_);
# UpdateHash($self->{CONFIG}, $config);
# }
sub UpdateHash {
my ($CONFIG, $config) = @_;
$CONFIG = {} unless ref($CONFIG) eq "HASH";
$config = {} unless ref($config) eq "HASH";
for my $param (keys %$config) {
if (ref($config->{$param}) eq "HASH") {
$CONFIG->{$param}={} if ref($CONFIG->{$param}) ne "HASH";
UpdateHash($CONFIG->{$param}, $config->{$param});
} else {
$CONFIG->{$param} = $config->{$param};
}
}
return $CONFIG;
}
#
# Example
#
my $main = {};
UpdateHash( $main, {
PARAM1 => "value1",
PARAM2 => 15,
} );
UpdateHash( $main, {
PARAM2 => 123,
PARAM3 => {
DATA1 => "value31",
DATA2 => "value32",
},
} );
UpdateHash( $main, {
PARAM3 => {
DATA2 => "newvalue32",
},
} );
# Here $main is equal to this :
# {
# PARAM1 => "value1",
# PARAM2 => 123,
# PARAM3 => {
# DATA1 => "value31",
# DATA2 => "newvalue32",
# },
# }