- 2008年5月13日 23:36
- 仕事のこと
きっとかわいいのだろう。
僕と彼女の間にはパー、ないしチョキで2回程勝ってやっと追いつける位の距離があった。グーではきっと追い抜いてしまう。
「ちょっと。君の顔が見たいから僕とじゃんけんしてくれないか」
そう声を掛ける程の興味を掻き立てられるわけでもないし、声を掛けるにしたっていささか突飛過ぎるではないか。僕と彼女が間宮兄弟の様な間柄であったなら別の話だが。
そう思いつつも視線は彼女に向けたまま歩きつづける。歩く速度はそのままで。
急ぐ理由はないのだ。むしろ、急がない理由はいくらでもある。
その急がない理由とやらと仕事と言うか趣味と言うか、最近書いているプログラムの実装を考えていると彼女はおもむろに左手を動かした。その左手は彼女のお尻の左頬をぐっと大胆に掴み、ずれたパンツを直したのだ。街中で正々堂々と。あまりにも正々堂々としたその仕草で呆気に取られてしまった。言葉を発するにしても「!!」が精一杯だ。
平日の午後に街中でお尻に食い込んだパンツを正々堂々と直す女の子を見かけたときに発する言葉を僕は知らない。「グワシってやった。今、グワシってやった」そう心の中で呪文のように繰り返すだけだった。
霧雨が眼鏡を濡らす鬱陶しい午後だった。
さて、Perl で存在しないクラスを use base すると
#!/usr/bin/perl use base 'Foo'; print "GUWASHI!\n";
print "GUWASHI!\n"; は実行されず
Base class package "Foo" is empty.
(Perhaps you need to 'use' the module which defines that package first.)
なんてエラーが出てしまいます。
このままだとおパンツ様が食い込んだままになって気持ち悪いので、どうにかしてグワシとしたいものです。
そこで、
#!/usr/bin/perl $Foo::VERSION = 1; use base 'Foo'; print "GUWASHI!\n";
と、$Foo::VERSION をでっちあげてやると無事グワシできるようになるわけです。
詳しくは base.pm の import を読んでみるとよいです。実際は、$Foo::GUWASHI = 'OSHIRI'; とかでもいいんですけどね。
とにかく、Foo のシンボルをでっちあげればいいわけです。
で、これと同じ理由で $Foo::VERSION なんかをでっちあげてやると Class::Inspector::loaded が真になります。
#!/usr/bin/perl
use Class::Inspector;
# Warning: something's wrong ...
warn Class::Inspector->loaded('Foo');
# 1 ...
$Foo::VERSION = 1;
warn Class::Inspector->loaded('Foo')
Class::Inspector::loaded で真が返ってくると Class::C3::ensure_class_loaded で真が返ってきます。Class::C3::ensure_class_loaded で真が返ってくると Class::C3::load_***_components で存在しないクラスを親に持つことができます。
こういった Perl のちょっと気持ち悪いとこを使って DBIx::Class::Schema::Slave では MyApp::Schema::Blog から実際には存在しない MyApp::Schema::Blog::Slave なんていう result_source クラスをでっちあげています。
先ほどバージョン 0.02300 をアップロードしました。
今回でこの記事に書いたような実装に変行しました。こうすると DBIx::Class::Schema::Slave で class_mappings と source_registrations を書き換えなくて済むんですね。DBIx::Class::Schema::register_source に next してやればそっちでスレーブを加味した class_mappings と source_registrations を作ってくれて精神衛生上いい。
あと前の記事の
$schema->resultset('Blog::Slave')->articles で返ってくる Article は
スレーブのものなので update や delete はできません。
逆に、$slave_article->blog で返ってくる Blog もスレーブのものになっているはずです。
(これはテストしてないですけど。今度、テストに加えておきます)
このテストを加えました。(t/06_search_related.t, t/33_related_resultset.t)
ネームスペースを DBIx::Class::Schema:Replicated にグワシっと変えてしまおうかなぁ、なんて思ってます。まだ変えないけど。
追記 (2008-05-14 16:30):
DBIx-Class-Schema-Slave-0.02300 では DBIx::Class::Schema::Loader base な MyApp::Schema では動かなくなってます。
my $schema = MyApp::Schema->connect( @master_connect_info );
my $master_foo = $schema->resultset('Foo')->find( $id );
my $slave_foo = $schema->resultset('Foo::Slave')->find( $id );
上記のようなコードでマスタはうまく接続できて find できるけど、スレーブの方は
Can't call method "resolve" on an undefined value at /usr/lib/perl5/site_perl/5.8.8/DBIx/Class/Row.pm line 720.
なんてエラーが出ます。
DBIx::Class::Schema::Loader base な MyApp::Schema でも __PACKAGE__->load_classes してれば大丈夫なんですけどね。__PACKAGE__->load_classes をせずに全くもって DBIx::Class::Schema::Loader に任せっきりにしている場合は上記のエラーが出ます。バグです。直します。
う~ん。どうやら、
・DBIx::Class::Schema::Loader base な MyApp::Schema
・MyApp::Schema->load_classes をコールしていない
・ResultSetManager をコンポーネントで指定している
場合に変な挙動になるみたい。やっかいだなぁ。
- Newer: DBIx::Class::Schema::Loader と DBIx::Class::InflateColumn::URI
- Older: DBIx::Class::Schema::Slave について
Comments:2
- clouder 2008年5月14日 15:29
$Bar::VERSION = 1;
↓
$Foo::VERSION = 1;じゃね?
- ちわ 2008年5月14日 16:13
> clouder さん
あ、バレました?
「$Foo::VERSION = 1;」に直しました。
ありがとうございます。
Trackbacks:0
- TrackBack URL for this entry
- http://hibinokoto.jp/mt/mt-tb.cgi/269
- Listed below are links to weblogs that reference
- 僕とじゃんけんしないか(存在しないクラスを use base する) from 日々のこと