ResultSetじゃなくて、配列やハッシュで取得するコンボネント

追記

名前変更してcodereposに上げてみました。
http://svn.coderepos.org/share/lang/perl/DBIx-Class-AsArrayHash/



独自にキャッシュしたいときや、viewがオブジェクトをサポートしてない時とかに必要にかられる。

コンポネント DBIx::Class::ResultSetX

package DBIx::Class::ResultSetX;

use strict;
use warnings;
use base qw( DBIx::Class );
__PACKAGE__->load_components(qw/ResultSetManager/);


sub searchX : ResultSet {
    my $self  = shift;
    my $cond  = shift || {};
    my $args  = shift || {};

    my $obj = $self->search( $cond , $args ) ;

    my @results = ();
    while( my $item = $obj->next ) {
        my %hash = $item->get_columns;
        push @results , \%hash ;
    }

    return \@results;
}

sub singleX : ResultSet {
    my ( $self , $cond , $args ) = @_;


    my $obj = $self->single( $cond , $args ) ;

    return unless $obj;

    my %hash = $obj->get_columns;

    return \%hash;
}

1;

読み込み

package Your::Schema::Foo;

use strict;
use warnings;

use base 'DBIx::Class';

#  順番に注意。Coreの前に呼ぶ必要がある。
__PACKAGE__->load_components(qw/ResultSetX Core/);

# 以下スキーマコードコード省略
1;

使い方

こんな感じ。基本、search() , single() と使い方同じで、取得するデータがオブジェクトではなく、配列、ハッシュなだけ。

 my $tasks = $c->model('DB::Foo')->searchX( { status => 1} );
 my $task  = $c->model('DB::Foo')->single( { id => 3 } );

作らないでもある気がするんだけど、cpanでは見つけれなかった >_< ご存知の方教えてください。