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

use strict;
use warnings;

use base 'Mojo::Base';

use Bootylicious::Timestamp;

__PACKAGE__->attr('timestamp');
__PACKAGE__->attr(limit => 10);
__PACKAGE__->attr('iterator');

sub prev {
    my $self = shift;

    my $i = $self->iterator;

    my $first = $self->articles->first;

    $i->rewind;
    while (my $article = $i->next) {
        if ($article->created->epoch == $first->created->epoch) {
            return $i->prev($self->limit)->last;
        }
    }

    return;
}

sub prev_timestamp {
    my $self = shift;

    my $prev = $self->prev;
    return '' unless $prev;

    return $prev->created->timestamp;
}

sub next {
    my $self = shift;

    my $i = $self->iterator;

    my $last = $self->articles->last;

    $i->rewind;
    while (my $article = $i->next) {
        last if $article->created->epoch == $last->created->epoch;
    }

    return $i->next;
}

sub next_timestamp {
    my $self = shift;

    my $next = $self->next;
    return '' unless $next;

    return $next->created->timestamp;
}

sub articles {
    my $self = shift;

    return $self->{articles} if $self->{articles};

    my $i = $self->iterator;

    if ($self->timestamp) {
        while (my $article = $i->next) {
            last
              if $article->created->epoch
                  <= Bootylicious::Timestamp->new(timestamp => $self->timestamp)->epoch;
        }
    }

    $i->prev;

    return $self->{articles} = $i->next($self->limit);
}

1;