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__

関数のインポートは良くないですけど時々こういうフックがあったらいいなと思います。

*1:暗黙に呼ばれるメソッドなので、Perlの慣習に従いすべて大文字に。