package something; sub new{ bless {}, __PACKAGE__ } sub doit { my ($self, $subref, $key) = @_; local $_ = $self->{ $key }; $subref->(); $self->{ $key } = $_; } package main; my $o = something->new; $o->doit(sub { $_ += 1 }, 'fred'); print "'$o->{fred}'\n"; # Outputs 1