summaryrefslogtreecommitdiff
path: root/lib/SelectSaver.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/SelectSaver.pm')
-rw-r--r--lib/SelectSaver.pm50
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/SelectSaver.pm b/lib/SelectSaver.pm
new file mode 100644
index 0000000000..4c764bedcf
--- /dev/null
+++ b/lib/SelectSaver.pm
@@ -0,0 +1,50 @@
+package SelectSaver;
+
+=head1 NAME
+
+SelectSaver - save and restore selected file handle
+
+=head1 SYNOPSIS
+
+ use SelectSaver;
+
+ {
+ my $saver = new SelectSaver(FILEHANDLE);
+ # FILEHANDLE is selected
+ }
+ # previous handle is selected
+
+ {
+ my $saver = new SelectSaver;
+ # new handle may be selected, or not
+ }
+ # previous handle is selected
+
+=head1 DESCRIPTION
+
+A C<SelectSaver> object contains a reference to the file handle that
+was selected when it was created. If its C<new> method gets an extra
+parameter, then that parameter is selected; otherwise, the selected
+file handle remains unchanged.
+
+When a C<SelectSaver> is destroyed, it re-selects the file handle
+that was selected when it was created.
+
+=cut
+
+require 5.000;
+use Carp;
+use Symbol;
+
+sub new {
+ @_ >= 1 && @_ <= 2 or croak 'usage: new SelectSaver [FILEHANDLE]';
+ my $fh = (@_ > 1) ? (select qualify($_[1], caller)) : select;
+ bless [$fh], $_[0];
+}
+
+sub DESTROY {
+ my $this = $_[0];
+ select $$this[0];
+}
+
+1;