【Perl】クロージャで継承

クロージャの概念をクラスとの対比でわかりやすく説明する
クロージャは、継承できないと書きましたが継承できるみたいです。(やりかたは今のところは思いつきません。)

2008年の記事なので、もう解決してそうな気がしますが。

 1 use v5.14.0;
 2 use warnings;
 3 
 4 sub test1::new {
 5     my $class = shift;
 6     my $data = 0;
 7     my $obj = {
 8         data => sub { $data = $_[0] if @_ >= 1; $data },
 9         say => sub { say "say" },
10     };
11 }
12 
13 sub test2::new {
14     my $class = shift;
15     my $base = test1->new;
16     my $obj = {
17         %$base,
18         say => sub { say "sei" },
19         get => sub { $base->{data}->() },
20     };
21 }
22 
23 my $t1 = test1->new;
24 my $t2 = test2->new;
25 $t1->{data}->(10);
26 $t2->{data}->(20);
27 
28 say $t1->{data}->();
29 $t1->{say}->();
30 say $t2->{data}->();
31 $t2->{say}->();
32 say $t2->{get}->();
33 say $t1->{data}->();
34 $t1->{say}->();

こうすると、継承っぽくオーバーライドっぽく見えそうですがどうでしょう。

またはこうか。
 1 use v5.14.0;
 2 use warnings;
 3 
 4 sub test1::new {
 5     my $obj = {}; my $class = shift;
 6     my $data = 0;
 7     $obj->{data} = sub { $data = $_[0] if @_ >= 1; $data };
 8     $obj->{say} = sub { say "say" };
 9     $obj;
10 }
11 
12 sub test2::new {
13     my $base = test1->new;
14     my $obj = {%$base}; my $class = shift;
15     $obj->{say} = sub { say "sei" };
16     $obj->{get} = sub { $obj->{data}->() };
17     $obj;
18 }
19 
20 my $t1 = test1->new;
21 my $t2 = test2->new;
22 $t1->{data}->(10);
23 $t2->{data}->(20);
24 
25 say $t1->{data}->();
26 $t1->{say}->();
27 say $t2->{data}->();
28 $t2->{say}->();
29 say $t2->{get}->();
30 say $t1->{data}->();
31 $t1->{say}



後、クロージャは言葉がカッコいい(厨)