DBICS::Loader使った時にふがふがしたいの巻
Loaderを使うと各スキーマは定義しなくてもLoaderが自動にやってくれるのですが、
スキーマをちょーっと拡張したい時とかは軽く工夫します。
例えば、
+------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------------------+----------------+ | id | int(10) unsigned | | PRI | NULL | auto_increment | | rid | varchar(10) | | UNI | | | | name_sei | varchar(255) | | | | | | name_mei | varchar(255) | | | | | | created_on | datetime | | | 0000-00-00 00:00:00 | | | timestamp | timestamp | YES | | CURRENT_TIMESTAMP | | +------------+------------------+------+-----+---------------------+----------------+
こんな感じのテーブルがあるとします。
名前の部分が姓と名にわかれてるのですが、これって、
$member = $self->model('Member')->search->first; $membr->name; # name_sei + name_mei
こんな感じでnameメソッドとかで姓と名をくっつけて表示したかったりしますよね?
そんな時はこんな感じでやるとよかばってん。
package Proj::Schema::Member; use strict; use warnings; sub name { my $self = shift; return $self->name_sei.$self->name_mei; }
Proj::Schema::Memberは普通Loaderで自動的に作られてロードされるのですが、
拡張したいスキーマと同じ名前のモジュールを作っておいてあげると、
Loaderが自動でそれを読み込んでくれます(requireしてくれます)
べんりべんりーとか思ってたのですが。。。
まあ、普通はこうやって拡張するのですが、これにはちと問題がありまして、
updateメソッドとかcreateメソッドとかをHookしたい時に普通に、
package Proj::Schema::Member; use strict; use warnings; sub update { my $self = shift; ... }
とか書くとredefinedワーニングが発生します。
requireでロードしてるからすね。なのーで、
updateとかのHookはload_componentsしてあげるのが吉です。(たぶん)
ただ、みたところLoaderには各スキーマ用でload_componentsさせる機能がないので
MoFedgeのLoaderでむりくり実装してみました。
なんかLoaderの仕様が微妙っす><
(追記)
各スキーマでのload_componentsはそれぞれ拡張クラスを用意してやって
その中でload_componentsすればいいだけだから問題ないっす。