The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

# NOTE:
# 5.10.0 leak an AV about weak refs.
# 5.8.x seems to leak some SVs, but it's just a cache.

use strict;

use constant HAS_LEAKTRACE => eval q{ use Test::LeakTrace 0.08; 1 };

use Test::More HAS_LEAKTRACE ? (tests => 3) : (skip_all => 'require Test::LeakTrace');
use Test::LeakTrace;

use Class::Monadic;

{
	package Foo;
	my $i;

	sub new{
		bless [], shift;
	}
	sub bar{ $i++ }
}

no_leaks_ok{
	my $o = Foo->new();

	Class::Monadic->initialize($o)->add_method(hello => sub {
		my $i;
		$i++;
	});
	$o->bar();
	$o->hello();

} 'add_method';


no_leaks_ok{
	my $o = Foo->new();

	Class::Monadic->initialize($o)->add_field(foo => [qw(banana apple)]);
	$o->bar();
	$o->set_foo('banana');

} 'add_field';

leaks_cmp_ok{
	my $o = Foo->new();
	{ package X; package Y; }

	Class::Monadic->initialize($o)->inject_base('X', 'Y');
} '<=', ($] < 5.010 ? 1 : 0), 'inject_base';