The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package WWW::2ch::Dat;
use strict;

use base qw( Class::Accessor::Fast );
__PACKAGE__->mk_accessors( qw( c subject key title resnum dat ) );

use WWW::2ch::Res;

sub new {
    my $class = shift;
    my $c = shift;
    my $subject = shift;

    my $self = bless {
	c => $c,
	reslist => [],
	res_by_num => {},
	subject => $subject,
    }, $class;

    $self->set_subjects;
    $self;
}

sub set_subjects {
    my ($self) = @_;
    $self->key($self->subject->{key});
    $self->title($self->subject->{title});
    $self->resnum($self->subject->{resnum});
}

sub get_cache {
    my ($self) = @_;

    my $cache = $self->c->cache->get($self->file);
    return unless $cache->{data};
    $self->subject($cache->{subject});
    $self->set_subjects;
    $self->dat($cache->{data});
    $cache;
}

sub set_cache {
    my ($self, $data, $res) = @_;
    $self->c->cache->set($self->file, {
	subject => $self->subject,
	data => $data,
	time => HTTP::Date::str2time($res->header('Last-Modified')),
	fetch_time => time,
    });
}

sub load {
    my ($self) = @_;

    $self->{reslist} = [];
    $self->{res_by_num} ={};
    return 0 unless $self->c && $self->key;
    $self->dat($self->c->worker->get_dat($self));
    $self->parse;
}

sub parse {
    my ($self, $dat) = @_;

    return 0 unless $self->dat;
    my $dat = $self->c->worker->parse_dat($self->dat);
    my $i = 1;
    foreach (@{ $dat }) {
	$_->{num} = $i++;
	$_->{key} = $self->key;
	$_->{resid} = $_->{num} if $_->{resid} eq '';
	$self->add_res( WWW::2ch::Res->new($self->c, $_) );
    }
    $i;
}

sub add_res {
    my($self, $dat) = @_;
    push(@{ $self->{reslist} }, $dat);
    $self->{res_by_num}->{$dat->num} = $dat;
}

sub reslist {
    my $self = shift;
    wantarray ? @{ $self->{reslist} } : $self->{reslist};
}

sub res {
    my ($self, $num) = @_;
    $self->{res_by_num}->{$num};
}

sub url {
    my ($self) = @_;
    $self->c->worker->daturl($self->key);
}

sub file {
    my ($self) = @_;
    $self->c->conf->{local_path} . $self->key . '.dat';
}

sub permalink {
    my ($self) = @_;
    $self->c->worker->permalink($self->key);
}

1;
__END__

=head1 NAME

WWW::2ch::Dat - remark list of BBS is treated. 


=head1 Method

=over 4

=item title

article name

=item resnum

number of remarks

=item reslist

return L<WWW::2ch::Res> list

=item res

A corresponding L<WWW::2ch::Res> to res number is returned. 

=item dat

returns it with raw article data.

=item permalink


=back

=head1 SEE ALSO

L<WWW::2ch::Res>

=head1 AUTHOR

Kazuhiro Osawa

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2006 by Kazuhiro Osawa

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.5 or,
at your option, any later version of Perl 5 you may have available.

=cut