MooseにDBIx::Class型を用意したいとか。

DBIx::Class型というかsearch等で取ってきたDBIx::Class::Rowと言えばいいのかな。

雰囲気としてはこんな感じの

package Foo;
use Moose;
use Moose::Util::TypeConstraints;
use MySchema;

my $schema = MySchema->connection($info);

class_type 'MySchema::UserMst';
coerce 'MySchema::UserMst'
    => from 'HashRef',
    => via {
        $schema->resultset('UserMst')->new_result($_);
    };

has user_data => (
    is => 'rw',
    isa => 'MySchema::UserMst',
    coerce =>  1,
);

my $foo = Foo->new( user_data => $hash );

print $foo->user_data->get_column('id');

つまり、メンバにRowオブジェクトを持たせたいケースにおいて、ハッシュのリファレンスが渡されたらcoerce使って自動型変換したいということなんです。

でも問題があって、viaにどうやって$schemaを用意するかがねぇ・・・。

coerceはあくまで型だからオブジェクト生成時に依存しないわけでそうなると$schemaをグローバルに持って置かないといけないので微妙だなぁと。

いやそりゃね、

our $schema;

class_type 'MySchema::UserMst';
coerce 'MySchema::UserMst'
    => from 'HashRef',
    => via {
        $schema->resultset('UserMst')->new_result($_);
    };

has user_data => (
    is => 'rw',
    isa => 'MySchema::UserMst',
    coerce =>  1,
);

local $schema = MySchema->connection($info);
my $foo = Foo->new( user_data => $hash );

とかね、local使って無理やり出来ないこともないけどさー。どう考えても微妙だよね、コレ。

となるとこの手のオブジェクト生成時に依存するような型は型としてやっぱ相応しくないんだろうね。

なのでとりあえず同等のことをやるために今のところtrigger使って実装してます。

has schema => (
    is => 'rw'
);

has user_data => (
    is      => 'rw',
    trigger => sub {
        my $self = shift;
        if ( $self->{user_data} && ref $self->{user_data} eq 'HASH' ) {
            $self->{user_data} = $self->schema->resultset('UserMst')->new_result($self->{user_data});
        }
    }
);

でも毎回trigger書くのもダサいし

sub has_row ($;%) {
    my $name  = shift;
    my %opt   = @_;
    my $table = delete $opt{table};
    $opt->{trigger} = sub {
        my $self = shift;
        if ( $self->{$name} && ref $self->{$name} eq 'HASH' ) {
            $self->{$name} = $self->schema->resultset($table)->new_result($self->{$name});
        }
    };
    has $name, %opt;
}

has_row user_data => (
    is    => 'rw',
    table => 'UserMst',
);

こんな感じにしたほうがいいのかな。ってかhasを拡張できるのならhas_rowみたいなの作らなくて済むんだけどどうなんだろ?

hasを拡張できるかどうかはまだ調査してないのでまた近いうちに調べてみようかなー。

あーでもMooseって、つかいにくーい。Moooseさいてー。あーもうMooooseなんてきらいー。こんりんざいMoooooseなんてぜったいつかわないぞぅ。Mooooooseのえんとりなんかかいてやるもんか!

Mooooooo、

   / ̄ ̄\
 /   _ノ  \   おっとそこまでだ
 |   ( ●)(●)   
. |     (__人__)____ 
  |     ` ⌒/ ─' 'ー\
.  |       /( ○)  (○)\
.  ヽ     /  ⌒(n_人__)⌒ \  っもご!
   ヽ   |、    (  ヨ    |
   /    `ー─−  厂   /
   |   、 _   __,,/     \