The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/pugs

use v6;
use Test;

plan 18;

my $foo        = 42;
my $was_inside = 0;

eval 'sub lvalue_test1() is rw {
  $was_inside++;
  return new Proxy:
    FETCH => { 100 + $foo },
    STORE => { $foo = $^new - 100 };
}';

{
    is $foo, 42,       "basic sanity (1)";
    is $was_inside, 0, "basic sanity (2)";

    eval_is 'lvalue_test1()',       142, "getting var through Proxy (1)", :todo<feature>;
    # No todo_is here to avoid unexpected succeeds (? - elaborate?)
    is      $was_inside,              1, "lvalue_test1() was called (1)", :todo<feature>;

    eval_is 'lvalue_test1() = 123', 123, "setting var through Proxy", :todo<feature>;
    is      $was_inside,              2, "lvalue_test1() was called (2)", :todo<feature>;
    is      $foo,                    23, "var was correctly set (1)", :todo<feature>;

    eval_is 'lvalue_test1()',       123, "getting var through Proxy (2)", :todo<feature>;
    is      $was_inside,              3, "lvalue_test1() was called (3)", :todo<feature>;
}

$foo        = 4;
$was_inside = 0;

eval 'sub lvalue_test2() is rw {
  $was_inside++;
  return new Proxy:
    FETCH => { 10 + $foo },
    STORE => { $foo = $^new - 100 };
}';

{
    is $foo, 4,        "basic sanity (3)";
    is $was_inside, 0, "basic sanity (4)";

    eval_is 'lvalue_test2()',       14, "getting var through Proxy (4)", :todo<feature>;
    # No todo_is here to avoid unexpected succeeds
    is      $was_inside,             1, "lvalue_test2() was called (4)", :todo<feature>;

    eval_is 'lvalue_test2() = 106', 16, "setting var through Proxy returns new value of the var", :todo<feature>;
    is      $was_inside,             2, "lvalue_test2() was called (5)", :todo<feature>;
    is      $foo,                    6, "var was correctly set (2)", :todo<feature>;

    eval_is 'lvalue_test2()',       16, "getting var through Proxy (5)", :todo<feature>;
    is      $was_inside,             3, "lvalue_test2() was called (5)", :todo<feature>;
}