The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strictures 1;
use Test::More;

BEGIN {
  eval { require Moo::Role; 1 }
    or plan skip_all => q{Requires Moo::Role};
}

BEGIN {
  package My::Role::OnOff;

  use Package::Variant
    importing => { 'Moo::Role' => [] },
    subs => [ qw(has before after around) ];

  sub make_variant {
    my ($me, $into, %args) = @_;
    my $name = $args{name};
    has $name => (is => 'rw');
    install "${name}_on" => sub { shift->$name(1); };
    install "${name}_off" => sub { shift->$name(0); };
  }
  $INC{"My/Role/OnOff.pm"} = __FILE__;
}

BEGIN {
  package LightSwitch;

  use My::Role::OnOff;
  use Moo;

  with OnOff(name => 'lights');
}

my $lights = LightSwitch->new;

is($lights->lights, undef, 'Initial state');
is($lights->lights_on, 1, 'Turn on');
is($lights->lights, 1, 'On');
is($lights->lights_off, 0, 'Turn off');
is($lights->lights, 0, 'Off');

done_testing;