DBIC::ResultSetManagerで

ふがふがってやつですが、↓です。

http://lists.scsys.co.uk/pipermail/dbix-class/2006-March/000924.html

おいらが昔、はまった時につたない英語でDBICのMLに投げたのですが、
結局解決せず。。。

MoFedge::Data::DBIC::ResultSetRegisterでやりたいことと微妙に違ったりもするかもしれませんが、
DBICのPluginを書くときにRの拡張をしたいぞよ!ってことが結構あると思います。

http://nekokak.jf.land.to/wiki/wiki.cgi/sub?action=ATTACH&page=Perl%2FDBIC&file=DBIx%2DClass%2DDigestColumns%2D0%2E01%2Etar%2Egz
これとか
http://nekokak.jf.land.to/wiki/wiki.cgi/sub?action=ATTACH&page=Perl%2FDBIC&file=DBIx%2DClass%2DEscapeSearch%2D0%2E01%2Etar%2Egz
これとか作ったときに遭遇したのですが、
load_componentsさせるときに両方指定した場合、
後に指定したPluginのResultSetアトリビュートが有効にならずに
ResultSetのメソッドとしてレジストされず使えないってことがありました。
どういうケースかはML参照してください。

ResultSetManager.pmをもりもりデバッグしたのですが、


package DBIx::Class::ResultSetManager;
....
sub _register_attributes {
my $self = shift;
my $cache = $self->_attr_cache;
return if keys %$cache == 0;

foreach my $meth (@{Class::Inspector->methods($self) || []}) {
my $attrs = $cache->{$self->can($meth)};
next unless $attrs;
if ($attrs->[0] eq 'ResultSet') {
no strict 'refs';
my $resultset_class = $self->_setup_resultset_class;
*{"$resultset_class\::$meth"} = $self->can($meth);
delete ${"${self}::"}{$meth};
}
}
}

Class::Inspector->methodsした後の$cache->{$self->can($meth)};から
$attrs;が取れない感じでした。
アトリビュートはおいら詳しくないからよーわからーん、
ってかEXPERIMENTALだし、まだ使わないほうがいいかなぁとか思ったのですが、
Rが拡張できないってかなり致命的なのでなんとかしたかったので無理やり
MoFedge::Data::DBIC::ResultSetRegisterを作った次第でする。
ちょっと時間がないので駆け足で。。

月曜日とかに追記するかもです。


今日はザーボンと闘ったのでつかれましたぁ。(謎

(追記)
後でMLをオイラももう一度よみなおしてみよっと。
なんか発見あるかもしれんし。