+ my $dump_section_weak;
+ $dump_section_weak = sub {
+ my ($section, $prefix) = @_;
+
+ my $raw = '';
+
+ foreach my $k (sort keys %$section) {
+ my $v = $section->{$k};
+ if (ref($v) eq 'HASH') {
+ $raw .= $prefix . "$k {\n";
+ $raw .= $dump_section_weak->($v, "$prefix ");
+ $raw .= $prefix . "}\n";
+ $raw .= "\n" if !$prefix; # add extra newline at 1st level only
+ } elsif (ref($v) eq 'ARRAY') {
+ foreach my $child (@$v) {
+ $raw .= $prefix . "$k {\n";
+ $raw .= $dump_section_weak->($child, "$prefix ");
+ $raw .= $prefix . "}\n";
+ }
+ } elsif (!ref($v)) {
+ die "got undefined value for key '$k'!\n" if !defined($v);
+ $raw .= $prefix . "$k: $v\n";
+ } else {
+ die "unexpected reference in config hash: $k => ". ref($v) ."\n";
+ }
+ }
+
+ return $raw;
+ };
+ my $dump_section = $dump_section_weak;
+ weaken($dump_section_weak);
+
+ my $raw = $dump_section->($c, '');