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

use strict;
use warnings;

use base 'Mojo::Base';

__PACKAGE__->attr('iterator');

use Bootylicious::ArticleWithPager;
use Bootylicious::IteratorSearchable;

sub new {
    my $self = shift->SUPER::new(@_);

    Carp::croak q/Iterator is a required parameter/ unless $self->iterator;

    return $self;
}

sub find {
    my $self = shift;
    my ($year, $month, $name) = @_;

    my $iterator = Bootylicious::IteratorSearchable->new($self->iterator);

    return $iterator->find_first(
        sub {
            my ($iterator, $elem) = @_;

            return unless $elem->created->year == $year;
            return unless $elem->created->month == $month;
            return unless $elem->name eq $name;

            my $prev = $iterator->take_prev;
            my $next = $iterator->take_next;

            return Bootylicious::ArticleWithPager->new(
                $elem,
                prev => $prev,
                next => $next
            );
        }
    );
}

1;