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

use strict;
use warnings FATAL => 'all';
use Test::More tests => 20;
use Variable::Lazy;

my $num = 1;

lazy my $x = { $num++ };

is($num, 1, '$num == 1');
is($x,   1, '$x   == 1');
is($num, 2, '$num == 2');
is($x,   1, '$x   == 1');

is(lazy { $num }, $num, 'lazy $num = $num');


sub foo {
	is($num, 2, '$num == 2');
	my $arg = shift;
	is($num, 3, '$num == 3');
	is($arg, 2, '$arg == 2');
}

foo(lazy { $num++ } );

lazy $x = { --$num };

is($num, 3, '$num == 3');
is($x,   2, '$x   == 2');
is($num, 2, '$num == 2');
is($x,   2, '$x   == 2');

lazy my $y = { ++$num };

$y = 0;

is($num, 2, '$num == 3');
is($y,   0, '$y   == 2');
is($num, 2, '$num == 3');


my $reference = $num;

sub bar {
	my $argument = $_[0];
	lazy my $first = { $argument++ };
	is($_[0], $reference, '$_[0] == $reference');
	is($argument, $reference, '$argument == $reference + 1');
	is($first, $reference, '$first == $reference');
	is($argument, $reference + 1, '$argument == $reference + 1');

	TODO: {
		local $TODO = "Arguments values are still buggy";
		lazy my $second = { $_[0]++ };
		is($second, $_[0], '$second == $_[0]');
		return $second;
	}
}

my $ret = bar($num);