-# $Id: Task.pm,v 1.3 2006-10-25 10:52:53 mike Exp $
package ZOOM::IRSpy::Task;
use strict;
use warnings;
+use Scalar::Util;
+
=head1 NAME
ZOOM::IRSpy::Task - base class for tasks in IRSpy
my $class = shift();
my($conn, $udata, $options, %cb) = @_;
- return bless {
+ my $this = bless {
irspy => $conn->{irspy},
conn => $conn,
udata => $udata,
cb => \%cb,
timeRegistered => time(),
}, $class;
+
+ #Scalar::Util::weaken($this->{irspy});
+ #Scalar::Util::weaken($this->{udata});
+
+ return $this;
}
die "can't run base-class task $this";
}
+# In general, this sets the Connection's options to what is in the
+# task's option hash and sets the option-hash entry to the
+# Connection's old value of the option: this means that calling this
+# twice restores the state to how it was before. (That's not quite
+# true as its impossible to unset an option that was previously set:
+# such options are instead set to the empty string.)
+#
+# As a special case, options in the task's option-hash whose names
+# begin with an asterisk are taken to be persistent: they are set into
+# the Connection (with the leading asterisk removed) and deleted from
+# the task's option-hash so that they will NOT be reset the next time
+# this function is called.
+#
sub set_options {
my $this = shift();
- my %options = %{ $this->{options} };
- foreach my $key (sort keys %options) {
- my $value = $options{$key};
- $this->conn()->log("irspy_debug", "$this setting option '$key' -> '$value'");
- $this->conn()->option($key, $value);
+ foreach my $key (sort keys %{ $this->{options} }) {
+ my $value = $this->{options}->{$key};
+ my $persistent = ($key =~ s/^\*//);
+ $value = "" if !defined $value;
+ $this->conn()->log("irspy_debug", "$this setting option '$key' -> ",
+ defined $value ? "'$value'" : "undefined");
+ my $old = $this->conn()->option($key, $value);
+ if ($persistent) {
+ delete $this->{options}->{"*$key"}
+ } else {
+ $this->{options}->{$key} = $old;
+ }
}
}