use strict; use warnings; use Promises 'deferred'; use Scalar::Util qw(weaken); use Test::More 0.89; my $count; my $cb; sub setup { $count = 0; $cb = sub { $count++ }; my $d = deferred; my $p = $d->promise; for ( 1 .. 5 ) { $p = $p->then( $cb, $cb ); } weaken $cb; return $d; } # Free resolve & reject on resolve() my $d = setup(); ok $cb, "Weakened ref exists pre-resolve"; $d->resolve(); is $count, 5, "Resolve successful"; ok !$cb, "Weakened ref freed post-resolve"; # Free resolve & reject on reject() $d = setup(); ok $cb, "Weakened ref exists pre-reject"; $d->reject(); is $count, 5, "Reject successful"; ok !$cb, "Weakened ref freed pos-reject"; done_testing;