package Lambda; use strict; use warnings; use Exporter qw( import ); our @EXPORT = qw( lambda ); sub _on_destroy(&@) { return bless([@_], 'Lambda::OnDestroy'); } sub Lambda::OnDestroy::DESTROY { my ($self) = @_; my ($cb, @args) = @$self; $cb->(@args) if $cb; } sub lambda { my $xr = \$_[0]; my $f = $_[1]; return sub { my $temp = $$xr; $$xr = $_[0]; my $sentry = _on_destroy { $$xr = $temp; }; return $f->(); } } 1;