has 'tree' => ( is => 'ro', isa => sub { {} }, default => sub { { '/' => { children => {} } } } ); has 'clean_tree' => ( is => 'rw', lazy => 1, predicate => 1, ); sub BUILD { my $s = shift; $s->app->add_hook (Dancer2::Core::Hook->new ( name => 'before_template', code => sub { ... if (!$s->has_clean_tree) { my %tree = %{$s->tree}; # Attempting to make shallow copy here. $s->clean_tree(\%tree); } # set active my $tree = $s->clean_tree->{'/'}; foreach my $segment (@segments) { $tree->{children}{$segment}{active} = 1; $tree = $tree->{children}{$segment}; } ... } )); }