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: