package Tie::Scalar::Battle; my %pool; our $attacker; sub TIESCALAR { my ($class, $name, $health) = @_; return $pool{$self + 0} = bless { name => $name, health => $health }, $class; } sub DESTROY { delete $pool{shift() + 0} } sub FETCH { shift->{health} } sub STORE { my ($self, $value) = @_; die "$self->{name} died" if $value <= 0; my $old_value = $self->{health}; $self->{health} = $value; if ($value < $old_value) { my $target = $attacker || (values %pool)[rand keys %pool]; local $attacker = $self; # print "$target->{name}, $target->{health}\n"; $target->STORE( $target->FETCH() - (1 + int rand 3) ); } return $value; } package main; tie $foo, 'Tie::Scalar::Battle', foo => 300; tie $bar, 'Tie::Scalar::Battle', bar => 300; # First punch $foo--;