Email::Sender::Transport::Failable - a wrapper to makes things fail predictably


Email-Sender documentation Contained in the Email-Sender distribution.

Index


Code Index:

NAME

Top

Email::Sender::Transport::Failable - a wrapper to makes things fail predictably

VERSION

Top

version 0.110001

DESCRIPTION

Top

This transport extends Email::Sender::Transport::Wrapper, meaning that it must be created with a transport attribute of another Email::Sender::Transport. It will proxy all email sending to that transport, but only after first deciding if it should fail.

It does this by calling each coderef in its failure_conditions attribute, which must be an arrayref of code references. Each coderef will be called and will be passed the Failable transport, the Email::Abstract object, the envelope, and a reference to an array containing the rest of the arguments to send.

If any coderef returns a true value, the value will be used to signal failure.

AUTHOR

Top

Ricardo Signes <rjbs@cpan.org>

COPYRIGHT AND LICENSE

Top


Email-Sender documentation Contained in the Email-Sender distribution.

package Email::Sender::Transport::Failable;
BEGIN {
  $Email::Sender::Transport::Failable::VERSION = '0.110001';
}
use Moose;
extends 'Email::Sender::Transport::Wrapper';
# ABSTRACT: a wrapper to makes things fail predictably


has 'failure_conditions' => (
  is  => 'ro',
  isa => 'ArrayRef',
  clearer    => 'clear_failure_conditions',
  auto_deref => 1,
  default    => sub { [] },
);

sub fail_if {
  my ($self, $cond) = @_;
  push @{ scalar $self->failure_conditions }, $cond;
}

around send_email => sub {
  my ($orig, $self, $email, $env, @rest) = @_;

  for my $cond ($self->failure_conditions) {
    my $reason = $cond->($self, $email, $env, \@rest);
    next unless $reason;
    die (ref $reason ? $reason : Email::Sender::Failure->new($reason));
  }

  return $self->$orig($email, $env, @rest);
};

__PACKAGE__->meta->make_immutable;
no Moose;
1;

__END__