+# Support function to look for and resolve template references.
+# It uses breadcrumbs to check for circular template references.
+#
+# Note: Any configuration value is also a template.
+sub lookup_templates {
+ my $tableref = shift;
+ my $target = shift;
+ my @breadcrumbs = @_;
+
+ if (grep { $_ eq $target } @breadcrumbs) {
+ die "Template loop! target backtrace:\n ",join("\n ",
+ $target,
+ @breadcrumbs),"\n";
+ }
+
+ foreach my $key (keys %{$tableref->{$target}}) {
+ my $value = $tableref->{$target}->{$key};
+ while ($value =~ /{{([-\w]+)}}/) {
+ lookup_templates($tableref, $1, $target, @breadcrumbs);
+ $value = $`.$tableref->{$1}->{$key}.$';
+ }
+ $tableref->{$target}->{$key} = $value;
+ }
+};
+