#!/usr/bin/perl
package Mail::Summary::Tools::Summary;
use Moose;
use Mail::Summary::Tools::Summary::List;
use YAML::Syck ();
use Scalar::Util ();
has title => (
isa => "Str",
is => "rw",
);
has lists => (
isa => "ArrayRef",
is => "rw",
auto_deref => 1,
default => sub { [ ] },
);
has extra => (
isa => "HashRef",
is => "rw",
required => 0,
);
has _message_id_index => (
isa => "HashRef",
is => "rw",
default => sub { return {} },
);
sub add_lists {
my ( $self, @lists ) = @_;
push @{ $self->lists }, @lists;
}
sub get_thread_by_id {
my ( $self, $message_id ) = @_;
$self->_message_id_index->{$message_id} ||= $self->_get_thread_by_id($message_id);
}
sub _get_thread_by_id {
my ( $self, $message_id ) = @_;
foreach my $list ( $self->lists ) {
if ( my $thread = $list->get_thread_by_id($message_id) ) {
return $thread;
}
}
return;
}
sub load {
my ( $class, $thing, %options ) = @_;
$options{$_} ||= {} for qw/summary list thread/;
local $YAML::Syck::ImplicitUnicode = 1;
my $hash = ref($thing) ? $thing : do {
die "Can't load YAML summary '$thing': no such file or directory\n" unless -e $thing;
YAML::Syck::LoadFile($thing);
};
$hash->{lists} = [ map { Mail::Summary::Tools::Summary::List->load( $_, %options ) } @{ $hash->{lists} } ];
$class->new( %{ $options{summary} }, %$hash );
}
sub save {
my ( $self, @args ) = @_;
local $YAML::Syck::ImplicitUnicode = 1;
# YAML.pm's output is prettier
my $dump = eval { require YAML; \&YAML::Dump } || \&YAML::Syck::Dump;
my $yaml = $dump->( $self->to_hash );
if ( @args ) {
my $file = shift @args;
# keep a backup
unlink "$file~";
rename $file, "$file~";
# YAML doesn't set the handle to :utf8, so we're doing the heavy lifting on our own
open my $fh, ">:utf8", $file or die "open('$file'): $!";
print $fh $yaml;
close $fh or die "close('$file'): $!";
return 1;
} else {
return $yaml;
}
}
sub to_hash {
my $self = shift;
return {
( $self->title ? (title => $self->title) : () ),
( $self->extra ? (extra => $self->extra) : () ),
lists => [ map { $_->to_hash } $self->lists ],
};
}
__PACKAGE__;
__END__
=pod
=head1 NAME
Mail::Summary::Tools::Summary - A simple summary format for multiple mailing
lists
=head1 SYNOPSIS
use Mail::Summary::Tools::Summary;
=head1 DESCRIPTION
=cut