JPerl Advent Calendar 2009 の Hacker Trackで、Tie::Traceについて書きました。
ちょっとコードが変だったんで、先ほど修正しました(余計なのがあったのと、コードとメッセージの不一致)
記事をcommitする際に、gitリポジトリをこわしてしまい、大変ご迷惑をおかけしました。
yappoさん、すみませんでした&修復ありがとうございました m(__)m
たぶん、原因は、push 中に ctrl-c 押してしまったことかと思われます。
以後、気をつけます...。
文中で Mouse の line 2 について
わかんないと書いてましたが、追いました。
以下のメッセージですね。
{name} => 'ktat' at accessor for name (.../Mouse/Meta/Method/Accessor.pm) line 2. {height} => 173 at accessor for age (.../Mouse/Meta/Method/Accessor.pm) line 2.
デバッガで適当にあたりを付けていると、Mouse::Meta::Method::Accessor の、_generate_accessor が関数を文字列($accessor)として作っています。
その後、evalって、コードにしているようです。デバッガから表示したところ、以下のコードでした。
sub { if (scalar(@_) >= 2) { return $_[0]->{q{name}} = $_[1]; } return $_[0]->{q{name}}; }
これだと、line 3 になっちゃうんだけど、これはデバッガか噛んでるせいなのかな?
よくわからんけど、デバッガで走らせると,Tie::Traceのメッセージもline 3 となっちゃいます。
まぁ、間違いなかろうとは思ったのですが、一応、確認しときました。
Mouse/Meta/Method/Accessor.pm
26 . "sub {warn 1;\n"; .... 58 $accessor .= "$slot = $value;\n; warn 2;return $slot";
これで、
1 at accessor for name (/usr/local/share/perl/5.8.8/Mouse/Meta/Method/Accessor.pm) line 2. {name} => 'ktat' at accessor for name (/usr/local/share/perl/5.8.8/Mouse/Meta/Method/Accessor.pm) line 3. at sample9.pl line 14. 2 at accessor for name (/usr/local/share/perl/5.8.8/Mouse/Meta/Method/Accessor.pm) line 4.
と、なりました。解決。
ただ、なんで、"accessor for name"というメッセージが出るのかは...追ってません。
Mooseはなんで、アクセサを定義した場所になるのかも...追ってません。