use strict; use warnings; package Var; sub new { my ($class, $value) = @_; bless \\$value, $class; }; sub bound { my $self = shift; defined $$$self; }; sub value { my $self = shift; return($$$self); }; sub equal { my ($v1, $v2) = @_; $v1 eq $v2 || $v1->bound && $v2->bound && $v1->value eq $v2->value; }; sub bind { my ($v1, $v2) = @_; return(0) if $v1->bound; $$v1 = $$v2; return(1); }; sub unbind { my $self = shift; $$self = \undef; };