overload が無効?
下記のようなモジュールを書いてみました。
http://rwds.net/trac.cgi/file/modules/Mortal/lib/Mortal.pm
概要は、mortal という関数をExportし、その関数に渡されたオブジェクトはbool以外のoverloadで死ぬようになり、何のメソッドを使っても死ぬようになります。
特に実用性はないです。一応用途はあるのですが、どっちかというとただの思い付き。
で、上のコードには、_mortal2, _mortal3というのもありますが、これは、mortal とあんまり変わりません。
sub mortal { bless shift , __PACKAGE__; } sub _mortal2 { my $self = shift; bless $self , __PACKAGE__; } sub _mortal3 { my $self = $_[0]; bless $self , __PACKAGE__; }
shift で取れるのはオブジェクトですが、それをいったん、変数に入れてるか入れてないのかの違い。で、下記のようなコードを書きます。
#!/usr/bin/perl use Mortal qw/:all/; use strict; use DateTime; $\ = "\n"; foreach my $func ('mortal', '_mortal2', '_mortal3') { no strict 'refs'; my $m = bless {}, "main"; eval { print ref $m; &{$func}($m) or "\$m is undef"; print $m; }; print $@; my $d = DateTime->now; eval { print ref $d; &{$func}($d) or "\$d is undef"; print $d }; print $@; }
結果は...
main This object has already been dead. at ./scripts/mortal.pl line 19 DateTime This object has already been dead. at ./scripts/mortal.pl line 27 main Mortal=HASH(0x814ccc0) DateTime This object has already been dead. at ./scripts/mortal.pl line 27 main Mortal=HASH(0x814ccc0) DateTime This object has already been dead. at ./scripts/mortal.pl line 27
DateTimeはすべてうまくいきますが、main の bless の方が変です。
mortal は期待どおりに、動くんですが、_mortal2 と_mortal3 はbless はされているのですが、overloadだけ無効になってるという状態です。
ネタのつもりで書いたら、よくわかりんないことになってしまった。
どなたか御存じでしたら、教えて欲しい...。