package DBIx::Otogiri::Iterator;
use strict;
use warnings;
use Class::Accessor::Lite (
    new => 0,
    ro => [qw/db sql binds table/],
    rw => [qw/sth fetched_count/],
);

sub new {
    my ($class, %opts) = @_;
    $opts{sth} = $opts{db}->dbh->prepare($opts{sql});
    $opts{sth}->execute($opts{binds} ? @{$opts{binds}} : ());
    $opts{fetched_count} = 0;
    bless {%opts}, $class;
}

sub next {
    my $self = shift;
    my $row = $self->sth->fetchrow_hashref;
    unless ($row) {
        $self->sth->finish;
        $self->{sth} = undef;
        return;
    }
    $self->{fetched_count}++;
    ($row) = $self->db->_inflate_rows($self->table, $row);
    return $row;
}

1;
__END__

=encoding utf-8

=head1 NAME

DBIx::Otogiri::Iterator - Iterator class for Otogiri

=head1 SYNOPSIS

    use Otogiri;
    my $db = Otogiri->new(connect_info => ['dbi:SQLite:...', '', '']);
    my $iter = $db->select(book => {price => {'>=' => 500}});
    
    while (my $row = $iter->next) {
        printf "Title: %s \nPrice: %s yen\n", $row->{title}, $row->{price};
    }
    
    printf "rows = %s\n", $iter->fetched_count;

=head1 DESCRIPTION

Iterator class for Otogiri. DO NOT USE THIS CLASS DIRECTLY.

=head1 METHODS

=head2 next

    my $row = $iter->next;

Returns a row data as single hashref. Then, increment internal value "fetched_count".

=head2 fetched_count

    my $count = $iter->fetched_count;

Returns a current "fetched_count".

=head1 LICENSE

Copyright (C) ytnobody.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 AUTHOR

ytnobody E<lt>ytnobody@gmail.comE<gt>

=head1 SEE ALSO

L<DBIx::Otogiri>

=cut