package Egg::View::Mail::Mailer::CMD;
#
# Masatoshi Mizuno E<lt>lusheE<64>cpan.orgE<gt>
#
# $Id: CMD.pm 285 2008-02-28 04:20:55Z lushe $
#
use strict;
use warnings;
use Carp qw/ croak /;

our $VERSION = '0.01';

sub _setup {
	my($class, $e)= @_;
	my $c= $class->config;
	$c->{cmd_path} ||= do {
		  -e '/usr/sbin/sendmail'       ? '/usr/sbin/sendmail'
		: -e '/usr/local/sbin/sendmail' ? '/usr/local/sbin/sendmail'
		: -e '/usr/bin/sendmail'        ? '/usr/bin/sendmail'
		: die q{'sendmail' command is not found.};
	  };
	$c->{cmd_option} ||= '-t -i';
	unless ($class->can('valid_to_address')) {
		no strict 'refs';  ## no critic.
		no warnings 'redefine';
		my $regexp= $c->{email_regexp} || qr{^[\w\d\-_]+@[\w\d\.\-_]+$};
		*{"${class}::valid_to_address"}=
		   sub { $_[1]=~m{$regexp} || croak qq"'$_[1]' is bad address." };
	}
	$class->next::method($e);
}
sub mail_send {
	my $self= shift;
	my $data= $_[0] ? ($_[1] ? {@_}: $_[0]) : croak q{I want mail data.};
	my $c= $self->config;
	$self->valid_to_address($data->{to}) || return 0;
	my $cmd_line= "$c->{cmd_path} $c->{cmd_option} $data->{to}";
	if ($data->{debug}) {
		$self->e->debug_out("# + mailsend : $cmd_line\n${$data->{body}}");
	} else {
		open  MSEND, "| $cmd_line";  ## no critic
		print MSEND ${$data->{body}};
		close MSEND;
	}
	1;
}

1;

__END__

=head1 NAME

Egg::View::Mail::Mailer::CMD - Mail is transmitted by using the sendmail command. 

=head1 SYNOPSIS

  package MyApp::View::Mail::MyComp;
  use base qw/ Egg::View::Mail::Base /;
  
  ...........
  .....
  
  __PACKAGE__->setup_mailer('CMD');

=head1 DESCRIPTION

It is Mailer system component to transmit mail by using the sendmail command. 

Use is enabled specifying 'CMD' for the first argument of 'setup_mailer' method.

=head1 CONFIGURATION

=head3 cmd_path

PATH of sendmail command.

It is set if the whereabouts of '/usr/sbin/sendmail', '/usr/local/sbin/sendmail',
 '/usr/bin/sendmail' is confirmed and it is found at the unspecification.
The exception is generated when not found anywhere.

=head3 cmd_option

Start option to pass to command line.

Default is '-t -i'.

=head3 email_regexp

Regular expression for easy format check in mail address.

This stays in an easy check so that there is no obstacle to pass the mail address
 to the command line. Please check the check on the format of a detailed mail 
 address beforehand by the module such as L<Email::Valid>.

Default is '^[\w\d\-_]+@[\w\d\.\-_]+$'.

Moreover, it is possible to check it there making 'Valid_to_address' method for 
the MAIL controller. Please look at the source code in detail.

=head3 debug

It operates by debug mode.

When an effective value is given, the content of mail comes to be sent to 'debug_out'
of the project without doing actual Mail Sending.

It tried to send the content of what mail by outputting 'debug_out' can be checked.

=head1 METHODS

=head2 mail_send ([MAIL_DATA_HASH])

This method is what 'send' method of L<Egg::View::Mail::Base> calls it internally.

The obstacle is generated by operating the component built in when calling 
directly.

=head1 SEE ALSO

L<Egg::Release>,
L<Egg::View::Mail>,
L<Egg::View::Mail::Base>,
L<Egg::View::Mail::Mailer::SMTP>,

=head1 AUTHOR

Masatoshi Mizuno E<lt>lusheE<64>cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2008 Bee Flag, Corp. E<lt>L<http://egg.bomcity.com/>E<gt>, All Rights Reserved.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.

=cut