use strict;
use warnings;
package Character;
use AutoExecute;
sub new {
my ($class) = @_;
return bless({
poisoned => 0,
}, $class);
}
sub poisoned {
my ($self) = @_;
return auto_execute {
my ($poisoned) = @_;
$self->{poisoned} = $poisoned if @_;
return $self->{poisoned};
};
}
package main;
my $char = Character->new();
my $poisoned = $char->poisoned;
print($poisoned, "\n"); # 0
$poisoned->(1);
print($poisoned, "\n"); # 1
$poisoned->(0);
print($poisoned, "\n"); # 0
####
package AutoExecute;
BEGIN {
our @EXPORT = qw( auto_execute );
*import = \&Exporter::import;
}
use overload
'""' => \&stringify,
'&{}' => \&code_ref,
;
sub auto_execute(&) {
my ($sub) = @_;
return bless(\$sub);
}
sub new {
my ($class, $sub) = @_;
return bless(\$sub, $class);
}
sub stringify {
my ($self) = @_;
my $sub = $$self;
return $sub->();
}
sub code_ref {
my ($self) = @_;
my $sub = $$self;
return $sub;
}
1;
####
use strict;
use warnings;
package Character;
sub new {
my ($class) = @_;
return bless({
poisoned => 0,
}, $class);
}
sub poisoned {
my ($self, $poisoned) = @_;
$self->{poisoned} = $poisoned if @_ >= 2;
return $self->{poisoned};
}
package main;
my $char = Character->new();
print($char->poisoned, "\n"); # 0
$char->poisoned(1);
print($char->poisoned, "\n"); # 1
$char->poisoned(0);
print($char->poisoned, "\n"); # 0