use 5.008;
use strict;
use warnings;
use Benchmark qw(cmpthese);

use LV ();
use LV::Backend::Magic ();
use LV::Backend::Sentinel ();
use LV::Backend::Tie ();

our ($Magic, $Sentinel, $Tie);

sub Magic :lvalue {
	LV::Backend::Magic::lvalue
		get => sub { $Magic },
		set => sub { $Magic = $_[0] };
}

sub Sentinel :lvalue {
	LV::Backend::Sentinel::lvalue
		get => sub { $Sentinel },
		set => sub { $Sentinel = $_[0] };
}

sub Tie :lvalue {
	LV::Backend::Tie::lvalue
		get => sub { $Tie },
		set => sub { $Tie = $_[0] };
}

cmpthese(-1, {
	Magic    => q[ $::Magic    = 0; ::Magic()    += $_ for 0..100 ],
	Sentinel => q[ $::Sentinel = 0; ::Sentinel() += $_ for 0..100 ],
	Tie      => q[ $::Tie      = 0; ::Tie()      += $_ for 0..100 ],
});

__END__
          Rate      Tie    Magic Sentinel
Tie      257/s       --     -16%     -50%
Magic    307/s      20%       --     -41%
Sentinel 518/s     101%      68%       --