package Mail::Miner::Assets;
use Mail::Miner;
use strict;
use warnings;
use Carp;

# Preloaded methods go here.

#This is the generic method
sub analyse {
    my ($class, %hash) = @_;
    for (qw(head body)) {
    croak "Need to supply a get$_ closure" if ref $hash{"get$_"} ne "CODE";
    }
    
    no strict 'refs'; 
    my @assets;
    for my $module (Mail::Miner->modules()) {
        push @assets, map { 
                        ref $_ eq "HASH" ? $_ :
                        { asset => $_, creator => $module } 
                      }
                        $module->process(%hash);
    }

    $hash{store}->(@assets) if ref $hash{store} eq "CODE";
    return @assets;
}

# This is the specific method
sub miner_analyse {
    my $obj = shift;
    Mail::Miner::Assets->analyse(
            getbody => sub { $obj->content->bodyhandle->as_string },
            gethead => sub { $obj->content->head->as_string },
            store   => sub { $obj->add_to_assets($_) for @_ }
    );
}

1;