-sub dump {
- my ($self, $level, $name, $variable, %options) = @_;
+sub clone_for_dump {
+ my ($src, $dumped) = @_;
+
+ return undef if !defined($src);
+ return $src if !ref($src);
+
+ $dumped ||= {};
+ my $addr = refaddr($src);
+
+ return $dumped->{$addr} if $dumped->{$addr // ''};
+
+
+ if (blessed($src) && $src->can('as_debug_info')) {
+ $dumped->{$addr} = $src->as_debug_info;
+
+ } elsif (ref($src) eq 'ARRAY') {
+ $dumped->{$addr} = [];
+
+ foreach my $entry (@{ $src }) {
+ my $exists = !!$dumped->{refaddr($entry) // ''};
+ push @{ $dumped->{$addr} }, clone_for_dump($entry, $dumped);