Practice of Programming

プログラム とか Linuxとかの話題

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だけ無効になってるという状態です。

ネタのつもりで書いたら、よくわかりんないことになってしまった。
どなたか御存じでしたら、教えて欲しい...。