The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use Mojo::Base -base;
use Mojo::Util 'monkey_patch';
use Scalar::Util 'weaken';
use Test::More;

my $i = 1;

monkey_patch 'main', 'new' => sub { ok 1, "new() $i"; my $obj = Mojo::Base::new(@_); $::trap{$obj} = $i++; $obj; };
monkey_patch 'main', 'DESTROY' => sub { ok 1, "DESTROY() " . delete $::trap{$_[0]}; };

sub add_callback {
  my($self) = @_;

  weaken $self;
  $self->{protocol}{cb} = sub {
    $self->{parent}{cb}->();
    $self->{parent};
  };
}

{
  my $yay;
  my $parent = main->new;
  my $child = main->new;

  $parent->{cb} = sub { $yay = 42; };

  $parent->{child} = $child;
  $child->{parent} = $parent;
  weaken $child->{parent};
  $child->add_callback;

  is $child->{protocol}{cb}->(), $parent, 'got parent from cb()';
  is $yay, 42, 'parent cb was called';
}

is_deeply [values %::trap], [], 'no leakage' or diag join ' ', 'leak obj:', sort values %::trap;

done_testing;

__END__
This test is just for proving theories I have about why
Mojo::Redis and subscriptions might leak.