The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bootylicious::Article;

use strict;
use warnings;

use base 'Bootylicious::Document';

use Bootylicious::Timestamp;
use Bootylicious::Pingback;
use Bootylicious::PingbackIterator;
use Bootylicious::PingbackIteratorFinder;
use Bootylicious::Comment;
use Bootylicious::CommentIteratorLoader;

sub title { my $self = shift; $self->metadata(title => @_) || $self->name }
sub description { shift->metadata(description => @_) }
sub link        { shift->metadata(link        => @_) }

sub tags {
    my $self = shift;
    my $value = shift;

    if (defined $value) {
        $value = join ', ' => sort keys %{
            {   map { $_ => 1 }
                map { s/^\s+//; s/\s+$//; $_ }
                grep { $_ ne '' } split ',' => $value
            }
          } if $value ne '';
        return $self->metadata(tags => $value);
    }

    my $tags = $self->metadata('tags');
    return [] unless $tags;

    return [map { s/^\s+//; s/\s+$//; $_ } split ',' => $tags];
}

sub has_tags { shift->tags ? 1 : 0 }

sub comments_enabled {
    my $self = shift;

    my $comments = $self->metadata('comments');

    return defined $comments && $comments =~ /^(no|false|disable)$/i ? 0 : 1;
}

sub pingbacks {
    my $self = shift;

    return Bootylicious::PingbackIterator->new(
        path => $self->path . '.pingbacks');
}

sub has_pingback {
    my $self       = shift;
    my $source_uri = shift;

    my $finder =
      Bootylicious::PingbackIteratorFinder->new(iterator => $self->pingbacks);

    return $finder->find($source_uri) ? 1 : 0;
}

sub pingback {
    my $self       = shift;
    my $source_uri = shift;

    my $pingback = Bootylicious::Pingback->new(
        created    => Bootylicious::Timestamp->new(epoch => time),
        source_uri => $source_uri
    );
    return $pingback->create($self->path . '.pingbacks');
}

sub comments {
    my $self = shift;

    return Bootylicious::CommentIteratorLoader->new(path => $self->path)
      ->load(Bootylicious::Iterator->new);
}

sub comment {
    my $self = shift;
    my %params = @_;

    my $number = 1;

    if (my $last = $self->comments->last) {
        ($number) = ($last->path =~ m/\.comment-(\d+)/);
        $number++;
    }

    my $path = $self->path . '.comment-' . $number;

    my $comment = Bootylicious::Comment->new(@_);

    return $comment->create($path);
}

1;