The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
package Email::Folder;
# ABSTRACT: read all the messages from a folder as Email::Simple objects
$Email::Folder::VERSION = '0.859';
use Carp;
use Email::Simple;
use Email::FolderType 0.6 qw/folder_type/;

#pod =head1 SYNOPSIS
#pod
#pod  use Email::Folder;
#pod
#pod  my $folder = Email::Folder->new("some_file");
#pod
#pod  print join "\n", map { $_->header("Subject") } $folder->messages;
#pod
#pod =head1 METHODS
#pod
#pod =head2 new($folder, %options)
#pod
#pod Takes the name of a folder, and a hash of options
#pod
#pod If a 'reader' option is passed in then that is
#pod used as the class to read in messages with.
#pod
#pod =cut

sub new {
    my $class  = shift;
    my $folder = shift || carp "Must provide a folder name\n";
    my %self = @_;

    my $reader;

    if ($self{reader}) {
        $reader = $self{reader};
    } else {
        $reader = "Email::Folder::".folder_type($folder);
    }
    eval "require $reader" or die $@;

    $self{_folder} = $reader->new($folder, @_);

    return bless \%self, $class;
}

#pod =head2 messages
#pod
#pod Returns a list containing all of the messages in the folder.  Can only
#pod be called once as it drains the iterator.
#pod
#pod =cut

sub messages {
    my $self = shift;

    my @messages = $self->{_folder}->messages;
    my @ret;
    while (my $body = shift @messages) {
        push @ret, $self->bless_message( $body );
    }
    return @ret;
}


#pod =head2 next_message
#pod
#pod acts as an iterator.  reads the next message from a folder.  returns
#pod false at the end of the folder
#pod
#pod =cut

sub next_message {
    my $self = shift;

    my $body = $self->{_folder}->next_message or return;
    $self->bless_message( $body );
}


#pod =head2 bless_message($message)
#pod
#pod Takes a raw RFC822 message and blesses it into a class.
#pod
#pod By default this is an Email::Simple object but can easily be overridden
#pod in a subclass.
#pod
#pod For example, this simple subclass just returns the raw rfc822 messages,
#pod and exposes the speed of the parser.
#pod
#pod  package Email::RawFolder;
#pod  use base 'Email::Folder';
#pod  sub bless_message { $_[1] };
#pod  1;
#pod
#pod =cut

sub bless_message {
    my $self    = shift;
    my $message = shift || die "You must pass a message\n";

    return Email::Simple->new($message);
}


#pod =head2 reader
#pod
#pod read-only accessor to the underlying Email::Reader subclass instance
#pod
#pod =cut

sub reader {
    my $self = shift;
    return $self->{_folder};
}

1;

#pod =head1 SEE ALSO
#pod
#pod L<Email::LocalDelivery>, L<Email::FolderType>, L<Email::Simple>
#pod
#pod =cut

__END__

=pod

=encoding UTF-8

=head1 NAME

Email::Folder - read all the messages from a folder as Email::Simple objects

=head1 VERSION

version 0.859

=head1 SYNOPSIS

 use Email::Folder;

 my $folder = Email::Folder->new("some_file");

 print join "\n", map { $_->header("Subject") } $folder->messages;

=head1 METHODS

=head2 new($folder, %options)

Takes the name of a folder, and a hash of options

If a 'reader' option is passed in then that is
used as the class to read in messages with.

=head2 messages

Returns a list containing all of the messages in the folder.  Can only
be called once as it drains the iterator.

=head2 next_message

acts as an iterator.  reads the next message from a folder.  returns
false at the end of the folder

=head2 bless_message($message)

Takes a raw RFC822 message and blesses it into a class.

By default this is an Email::Simple object but can easily be overridden
in a subclass.

For example, this simple subclass just returns the raw rfc822 messages,
and exposes the speed of the parser.

 package Email::RawFolder;
 use base 'Email::Folder';
 sub bless_message { $_[1] };
 1;

=head2 reader

read-only accessor to the underlying Email::Reader subclass instance

=head1 SEE ALSO

L<Email::LocalDelivery>, L<Email::FolderType>, L<Email::Simple>

=head1 AUTHORS

=over 4

=item *

Simon Wistow <simon@thegestalt.org>

=item *

Richard Clamp <richardc@unixbeard.net>

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2006 by Simon Wistow.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut