package Lisp::Localize; use strict; use vars qw($DEBUG); use Lisp::Symbol qw(symbolp); sub new { my $class = shift; my $self = bless {}, $class; print "new $self\n" if $DEBUG; $self; } sub save_and_set { my($self, $symbol, $newval) = @_; die "Not a symbol $self->local($symbol, $newval)" unless symbolp($symbol); print "Localize $symbol->{'name'}\n" if $DEBUG; die "Can't localized the same symbol twice" if exists $self->{$symbol}; unless (exists $symbol->{'value'}) { $self->{$symbol} = [$symbol]; } else { $self->{$symbol} = [$symbol, $symbol->{'value'}]; } $symbol->value($newval); $self; } sub DESTROY { my $self = shift; # restore all values for (values %$self) { my $sym = shift @$_; print "Restoring $sym->{'name'}\n" if $DEBUG; if (@$_) { $sym->{'value'} = shift @$_; } else { delete $sym->{'value'}; } } } 1;