And Jeff said, "Let there be merging"
Submitted by jeff on December 5, 2008 - 4:25pm.
In order to support per-directory options for mod_perl6, I had to implement configuration merging, which I've been avoiding like the plague. But it's done, and it looks like this (some code omitted for brevity):
sub server_merge(%base, %new)
{
my %merged;
# merge handlers -- never inherit
for @server_phases.map({$_ ~ '_handler'}) -> $h {
%merged{$h} = %new{$h};
}
return %merged;
}
sub dir_merge(%base, %new)
{
my %merged;
# merge options -- inherit only if not set
%merged = {};
for %valid_options.keys -> $k {
%merged{$k} = %new.exists($k) ??
%new{$k} !! %base{$k};
}
# merge handlers -- never inherit
for @dir_phases.map({$_ ~ '_handler'}) -> $h {
%merged{$h} = %new{$h};
}
return %merged;
}
I still think it's cool that this is written in Perl 6. mod_parrot handles all the hard stuff behind the scenes so mod_perl6 code can stay lean and mean!
