package EvalScalar; use Carp; sub import { my $caller_pkg = caller; my $my_pkg = shift; for (@_) { my $var = $_; $var =~ s/^\$//; my $temp; tie $temp, $my_pkg; *{$caller_pkg . '::' . $var} = \$temp; } } sub unimport { my $caller_pkg = caller; my $my_pkg = shift; for (@_) { my $var = $_; $var =~ s/^\$//; my $temp; my $old_var = *{$caller_pkg . '::' . $var}{SCALAR}; *{$caller_pkg . '::' . $var} = \$temp; untie $$old_var; } } sub TIESCALAR { my $pkg = shift; my $type = shift; my $temp = ''; my $self = \$temp; bless $self, $pkg; return $self; } sub STORE { my $self = shift; my $value = shift; $value =~ s/\$(\w+)(?!::)/'$' . caller() . '::' . $1/ge; $$self = $value; } sub FETCH { my $self = shift; my $value = eval $$self; if ($@) { carp $@; return ''; } else { return $value; } } 1;