ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Guard/Guard.pm
(Generate patch)

Comparing Guard/Guard.pm (file contents):
Revision 1.3 by root, Sat Dec 13 17:50:29 2008 UTC vs.
Revision 1.4 by root, Sat Dec 13 18:34:18 2008 UTC

3Guard - safe cleanup blocks 3Guard - safe cleanup blocks
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use Guard; 7 use Guard;
8
9 # temporarily chdir to "/etc" directory, but make sure
10 # to go back to "/" no matter how myfun exits:
11 sub dosomething {
12 scope_guard { chdir "/" };
13 chdir "/etc";
14
15 call_function_that_might_die_or_other_fun_stuff;
16 }
8 17
9=head1 DESCRIPTION 18=head1 DESCRIPTION
10 19
11This module implements so-called "guards". A guard is something (usually 20This module implements so-called "guards". A guard is something (usually
12an object) that "guards" a resource, ensuring that it is cleaned up when 21an object) that "guards" a resource, ensuring that it is cleaned up when
60 die if $@; 69 die if $@;
61 70
62Except it is much faster, and the whole thing gets executed even when the 71Except it is much faster, and the whole thing gets executed even when the
63BLOCK calls C<exit>, C<goto>, C<last> or escapes via other means. 72BLOCK calls C<exit>, C<goto>, C<last> or escapes via other means.
64 73
74If multiple BLOCKs are registered to the same scope, they will be executed
75in reverse order. Stuff like C<local> is managed via the same mechanism,
76so variables C<local>ised after calling C<scope_guard> will be restored
77when the guard runs.
78
65See B<EXCEPTIONS>, below, for an explanation of exception handling 79See B<EXCEPTIONS>, below, for an explanation of exception handling
66(C<die>) within guard blocks. 80(C<die>) within guard blocks.
67 81
68Example: Temporarily change the directory to F</etc> and make sure it's 82Example: temporarily change the timezone for the current process,
69set back to F</> when the function returns: 83ensuring it will be reset when the C<if> scope is exited:
70 84
71 sub dosomething { 85 use Guard;
72 scope_guard { chdir "/" }; 86 use POSIX ();
73 chdir "/etc";
74 87
75 ... 88 if ($need_to_switch_tz) {
89 # make sure we call tzset after $ENV{TZ} has been restored
90 scope_guard { POSIX::tzset };
91
92 # localise after the scope_guard, so it gets undone in time
93 local $ENV{TZ} = "Europe/London";
94 POSIX::tzset;
95
96 # do something with the new timezone
76 } 97 }
77 98
78=item my $guard = guard BLOCK 99=item my $guard = guard BLOCK
79 100
80Behaves the same as C<scope_guard>, except that instead of executing 101Behaves the same as C<scope_guard>, except that instead of executing

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines