use parent を使って継承した時に try-catch あたりを継承先に突っ込んだりできないものかと考え倦ねいたけど中途半端なところでギブアップした。Magoから呼ぶとcaller()のEXPRをインクリメントしないと動かない。このあたりは要ハック。
プラグマも適用できればと思ったりしたけれど普通にuseしてimport()でやった方が楽そう。とりあえずココまで。
Try::Tinyをこんな使い方して大丈夫なのかは知らない。
package Oya; use strict; use warnings; use Try::Tiny (); sub new { return {}, shift; } my $child = (caller(1))[0]; no strict 'refs'; *{"$child\::try"} = \&Try::Tiny::try; *{"$child\::catch"} = \&Try::Tiny::catch; *{"$child\::finally"} = \&Try::Tiny::finally; 1;
package Kodomo; use strict; use warnings; use parent 'Oya'; sub foo { printf "Hi! I'm '%s'\n", __PACKAGE__; try { die "Oops"; } catch { print "Caught!!!!\n"; }; } 1;
use strict; use warnings; use Kodomo; my $child = Kodomo->new; $child->foo; __END__
Hi! I'm 'Kodomo' Caught!!!!
追記
ツッコミ感謝。
ブックマークコメントより
シンボルテーブルいじらなくても
Try::Tiny->export($child);
でおk。
コメントより
typo修正ed
s/Catched/Caught/g;