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: