Re: use parent と Try::Tiny とか
use parent と Try::Tiny とか - punitan (a.k.a. punytan) のメモ
use parent を使って継承した時に try-catch あたりを継承先に突っ込んだりできないものかと考え倦ねいたけど中途半端なところでギブアップした。
use parent qw(Foo);
で関数をインポートできるとなるといろいろぶち壊す気がするので混ぜるな危険だとは思います。
とはいえRubyのinherited()みたいにあるクラスPが小クラスCに継承されたタイミングで呼ばれるPへのフックはあってもいいかなと思いました。
具体的にはこんなの*1:
diff --git a/parent.pm b/parent.pm --- a/parent.pm +++ b/parent.pm @@ -25,6 +25,9 @@ sub import { no strict 'refs'; push @{"$inheritor\::ISA"}, @_; }; + foreach my $parent(@_) { + $parent->INHERITED($inheritor) if $parent->can('INHERITED'); + } }; "All your base are belong to us"
使い方はこんな感じ:
# P.pm package P; use Mouse; use Try::Tiny; has hello => ( is => 'rw', default => sub { 'Hello, world!' }, ); sub INHERITED { my($class, $child) = @_; Try::Tiny->export($child); } 42; __END__
# C.pm package C; use Mouse; use parent qw(P); try { die 'I am dying!'; } catch { my($e) = @_; warn "Caught: $e"; }; 42; __END__
#!perl use strict; use warnings; use C; say C->new->hello(); # Hello, world! __END__
関数のインポートは良くないですけど時々こういうフックがあったらいいなと思います。