パルカワ2

PerlとRubyとイチャラブ

overload.pm 1.18を見てた。

use 5.10.1;
use strict;
use warnings;
use URI;
use Plack::Request;
use Scalar::Util qw(blessed);

my $uri = URI->new("http://localhost/");
my $req = Plack::Request->new({});

say +overload::StrVal($uri); #=> URI::http=SCALAR(0x7fa3aa8663c0)
say +overload::AddrRef($uri); #=> URI::http=SCALAR(0x7fa3aa8663c0)

say +overload::StrVal($req) || "no"; #=> Plack::Request=HASH(0x7f7ff3958b20)
say +overload::AddrRef($req)|| "no"; #=> Plack::Request=HASH(0x7f7ff3958b20)

# overloadされてたら、CodeRefが返ってくる
say +overload::Overloaded($uri); #=> CODE(0x7faea8862418)
say +overload::Overloaded($req) || "no"; #=> no

# URIのas_stringのCodeRefが返ってくるっぽい
say +overload::Method($uri,'""'); #=> CODE(0x7faea883e250)
say +overload::Method($req, '""') || "no"; #=> no

# "", 0+, bool, nomethodの順番で、overloadされてるのがあればCodeRefが返ってくるっぽい
# URIの場合、""が上書きされているのでas_string
say +overload::OverloadedStringify($uri); #=> CODE(0x7faea883e250)
say +overload::OverloadedStringify($req) || "no"; #=> no

# 大元
say +overload::mycan(blessed($uri), '()'); #=> GLOB(0x7fa9998474b8)

むずかしい。