1 use Test::More qw(no_plan);
2 use Scalar::Util qw(refaddr weaken isweak);
4 use aliased 'MooseX::Antlers::RefTracker';
5 use aliased 'MooseX::Antlers::RefFilter';
8 bar => { baz => [ 'quux', { fleem => 1 } ] },
9 skald => \[ { hot => 'story' } ],
12 my @expect = split "\n", <<'EOEXPECT';
17 ${$foo->{"skald"}}->[0]
20 my $tracker = RefTracker->new({ root_name => '$foo' });
22 $tracker->visit($foo);
24 delete $foo->{bar}{baz};
26 my $result = $tracker->traced_ref_map;
30 [ sort { length($a) <=> length($b) } values %$result ],
31 "Expected results present"
34 my %map = reverse %$result;
36 foreach my $e (@expect) {
40 die "Error $@ evaluating $e" if $@;
43 is($map{$e},refaddr($value), "Result for ${e} ok");
47 one => { two => three },
48 bard => $foo->{skald},
49 bard_guts => ${$foo->{skald}},
50 empty_now => $foo->{bar},
53 weaken($flimflam->{weak_one} = $flimflam->{one});
54 weaken($flimflam->{weak_member}[0] = $flimflam->{bard});
55 weaken(${$flimflam->{weak_scalar}} = $flimflam->{bard_guts});
57 #use Data::Dumper; $Data::Dumper::Indent = 1;
59 #warn "Flimflam:\n".Dumper($flimflam);
61 my $replacer = RefFilter->new({
62 external_mappings => $result,
63 root_name => '$final',
66 my $copyflam = $replacer->visit($flimflam);
68 my $dump = Dump($copyflam);
69 my $fixup = $replacer->fixup_code;
71 #warn "Dump:\n".$dump;
72 #warn "Fixup:\n".$fixup;
74 my $final = Load($dump);
76 #warn "Unfixed final:\n".Dumper($final);
81 die "fixup code died: $@" if $@;
84 #warn "Fixed final:\n".Dumper($final);
86 is_deeply($flimflam, $final, 'Structures deeply the same after fixup');
88 ok(isweak($final->{weak_one}), '$final->{weak_one} is a weak ref');
89 ok(isweak($final->{weak_member}[0]), '$final->{weak_member}[0] is a weak ref');
90 ok(isweak(${$final->{weak_scalar}}), '${$final->{weak_scalar}} is a weak ref');