-  my $self = shift;
-  my $key  = shift;
-  @_ and $self->{_notes}->{$key} = shift;
-  #warn Data::Dumper->Dump([\$self->{_notes}], [qw(notes)]);
-  $self->{_notes}->{$key};
+  my ($self,$key,$value) = @_;
+  $self->{_notes}->{$key} = $value if defined $value;
+  return $self->{_notes}->{$key};

I originally considered these functionally identical, but they are not. The new code, called with, say, $txn->notes('discard',undef), would result in evaluation as if it were a 'get' method rather than setting the 'discard' note to undef. That seems quite dangerous. I suggest either reverting the language back to the '@_ and' model, or else doing something like:

my ($self,$key,$value) = @_;
$self->{_notes}->{$key} = $value if scalar @_ > 2;
return $self->{_notes}->{$key};


I'd be happy to submit a patch for either sort of language.



Incidentally, I came across this when looking into a bug that was caused when I did $txn->recipients(grep {$_ ne $rcpt} $txn->recipients) -- expecting it to clear the recipient list if grep returned an empty list. Instead, it predictably behaved as a get method, e.g. a noop. I solved this by adding a clear_recipients() method to Qpsmtpd::Transactions, then thought better of it and added remove_recipients() instead. I'll try to get around to submitting these as well if they seem useful :)

-Jared

Reply via email to