use strict; use warnings; my($status); tie $status, 'Status'; $status = 'ungnown'; # warning, and value does not get set. $status = 'good'; # works print "$status"; package Status; use Tie::Scalar; use Carp; use base qw(Tie::StdScalar); sub TIESCALAR { my $class = shift; my $status = shift; bless \$status, $class; } sub STORE { my($me, $value) = @_; unless ($value eq 'good'){ warn("invalid status: $value. Status not set"); return undef; } ${$me} = $value; } sub FETCH { my($status) = @_; return ${$status}; }