The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 19;
use ok 'Scalar::Defer';

my ($x, $y);
my $d = defer { ++$x };
my $l = lazy { ++$y };

is($d, $l, "1 == 1");
is($d, 2, "defer is now 2");
is($l, 1, "but lazy stays at 1");
isnt($d, $l, "3 != 1");

my $forced = force $d;
is($forced, 4, 'force($x) works');
is($forced, 4, 'force($x) is stable');
is(force $forced, 4, 'force(force($x)) is stable');

$SomeClass::VERSION = 42;
sub SomeClass::meth { 'meth' };
sub SomeClass::new { bless(\@_, $_[0]) }

my $obj = defer { SomeClass->new };

ok(!ref($obj), 'ref() returns false for deferred values');
is(ref(force $obj), 'SomeClass', 'ref() returns true for forced values');
is($obj->meth, 'meth', 'method call works on deferred objects');
is($obj->can('meth'), SomeClass->can('meth'), '->can works too');
ok($obj->isa('SomeClass'), '->isa works too');
is($obj->VERSION, SomeClass->VERSION, '->VERSION works too');

ok( Scalar::Defer->can("can"), "can('can') as a class method" );
ok( !Scalar::Defer::Deferred->can('blah'), "can('blah') is false as a class method" );

ok( $obj->can("can"), "can('can') as an object method" );
ok( $obj->can("meth"), "can('meth')");
ok( !$obj->can('blah'), "can('blah') is false as an object method" );