package Scope::Guard; use strict; use warnings; use vars qw($VERSION); $VERSION = '0.03'; sub new { my $class = shift; my $handler = shift() || die "Scope::Guard::new: no handler supplied"; my $ref = ref $handler || ''; die "Scope::Guard::new: invalid handler - expected CODE ref, got: '$ref'" unless (UNIVERSAL::isa($handler, 'CODE')); bless [ 0, $handler ], ref $class || $class; } sub dismiss { my $self = shift; my $dismiss = @_ ? shift : 1; $self->[0] = $dismiss; } sub DESTROY { my $self = shift; my ($dismiss, $handler) = @$self; $handler->() unless ($dismiss); } 1; __END__ =pod =head1 NAME Scope::Guard - lexically scoped resource management =head1 SYNOPSIS my $sg = Scope::Guard->new(sub { ... }); # or my $sg = Scope::Guard->new(\&handler); $sg->dismiss(); # disable the handler =head1 DESCRIPTION This module provides a convenient way to perform cleanup or other forms of resource management at the end of a scope. It is particularly useful when dealing with exceptions: the Scope::Guard constructor takes a reference to a subroutine that is guaranteed to be called even if the thread of execution is aborted prematurely. This effectively allows lexically-scoped "promises" to be made that are automatically honoured by perl's garbage collector. For more information, see: L =head2 new =head3 usage my $sg = Scope::Guard->new(sub { ... }); # or my $sg = Scope::Guard->new(\&handler); =head3 description Create a new Scope::Guard object which calls the supplied handler when its C method is called, typically when it goes out of scope. =head2 dismiss =head3 usage $sg->dismiss(); # or $sg->dismiss(1); =head3 description Detach the handler from the Scope::Guard object. This revokes the "promise" to call the handler when the object is destroyed. The handler can be re-enabled by calling: $sg->dismiss(0); =head1 VERSION 0.03 =head1 SEE ALSO =over =item * L =item * L =item * L =item * L =back =head1 AUTHOR chocolateboy: =head1 COPYRIGHT Copyright (c) 2005-2007, chocolateboy. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself. =cut