package Mail::Decency::ContentFilter::Core;

use Moose;
extends 'Mail::Decency::Core::Child';

use version 0.74; our $VERSION = qv( "v0.1.4" );

=head1 NAME

Mail::Decency::ContentFilter::Core

=head1 DESCRIPTION

Base class for all content filter


=head1 CLASS ATTRIBUTES

=head2 max_size : Int

Max size in bytes for an email to be checked.

=cut

has max_size => ( is => 'ro', isa => 'Int', default => 0 );

=head2 timeout : Int

Timeout for each policy module.

Default: 30

=cut

has timeout  => ( is => 'rw', isa => 'Int', default => 30 );

=head2 ArrayRef[Str] : Int

For easy module initialization, developers can set array of the config params. They will be set if they are defined.

    # do this
    has config_params => ( is => 'ro', isa => 'ArrayRef[Str]', default => sub { [ qw/ something / ] } );
    
    # an it will be initialized
    $self->something( $self->config->{ something } )
        if defined $self->config->{ something };

=cut

has config_params => ( is => 'ro', isa => 'ArrayRef[Str]', predicate => 'has_config_params' );


=head1 METHODS

=head2 init

=cut

sub init {
    my ( $self ) = @_;
    
    # run pre-init phase
    $self->pre_init() if $self->can( 'pre_init' );
    
    # each filter might have a max size for files to be filtered
    if ( defined $self->config->{ max_size } ) {
        $self->max_size( $self->config->{ max_size } );
    }
    
    # set timeout
    $self->timeout( $self->config->{ timeout } )
        if defined $self->config->{ timeout };
    
    # having list of optional config params ?
    if ( $self->has_config_params ) {
        foreach my $attr( @{ $self->config_params } ) {
            $self->$attr( $self->config->{ $attr } )
                if $self->config->{ $attr };
        }
    }
    
}


=head2  session_data, file, file_size, from, to, mime

Convinient accessor to the server's session data 

=cut

sub session_data {
    return shift->server->session_data;
}

sub file {
    return shift->session_data->file;
}
sub file_size {
    return shift->session_data->file_size;
}
sub from {
    return shift->session_data->from;
}
sub to {
    return shift->session_data->to;
}
sub mime {
    return shift->session_data->mime;
}

=head2 write_mime

Write latest MIME data back to file

=cut

sub write_mime {
    return shift->session_data->write_mime;
}

=head1 AUTHOR

Ulrich Kautz <uk@fortrabbit.de>

=head1 COPYRIGHT

Copyright (c) 2010 the L</AUTHOR> as listed above

=head1 LICENCSE

This library is free software and may be distributed under the same terms as perl itself.

=cut

1;