Teng::Iterator にcountメソッドを生やすpluginを書いてみた

 Tengを使い始めてイテレーターオブジェクトにcountメソッドが無いのに気が付きました。 DBIx::Skinny では確かcountメソッドが実装されていたと思ったのですが Teng::Iterator のソースを見たらありませんでした。

でもallメソッドがあるので scalar @{$itr->all} とすれば同じ結果が得られるのは自明なのですがやはり $itr->count と素直に呼びたいですよね。

イテレーターにcountメソッドを生やしておけば $user->tweets->count みたいに直感的に書けるのではないかと思います。

package Teng::Plugin::ItrCount;
use strict;
use warnings;

no strict 'refs';
*{"Teng::Iterator::count"} = sub {
    my $self = shift;
    my $rows;
    if ( $self->{sth} ) {
        $rows = $self->{sth}->rows;
    }
    $rows;
};

1;
__END__

=head1 NAME

Teng::Plugin::ItrCount - Itarator Count rows in database.

=head1 NAME

    package MyDB;
    use parent qw/Teng/;
    __PACKAGE__->load_plugin('ItrCount');

    package main;
    my $db = MyDB->new(...);
    my $user_itr   = $db->search('user'); # => Get the iterator object.
    my $user_count = $user_itr->count(); # => same as SELECT COUNT(*) FROM user;

=head1 DESCRIPTION

This plugin provides shorthand for counting rows in database.

=head1 METHODS

=over 4

=item $user_itr->count() : Int

I The number of rows.

=back
created:

Back to top