-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);
+
+      weaken($dumped->{$addr}->[-1]) if $exists;