日向夏特殊応援部隊

俺様向けメモ

Sub::Exporter の collectors

Sub::Exporter の collectors だけ良く分からなくて、

を見たんだけど、その部分の解説とコードが中途半端で意味が良く分かりませんでした。

そんな訳で Google 先生に聞いたところ、

から、

が見つかったので読んでみるとやっと理解出来た件。Collectors に関しては 191 ページ目くらいから。*1

まぁ詳細はスライドに delegate するとして、サンプルを書いてみると。

package String::Truncate;

use strict;
use warnings;

use YAML;
use Perl6::Say;
use Sub::Exporter -setup => +{
    exports => [
        trunc => \'_build_trunc',
    ],
    collectors => [ qw(defaults custom) ],
};

sub trunc {
    my ($str, $length) = @_;
    substr($str, 0, $length);
}

sub _build_trunc {
    my ($class, $name, $arg, $col) = @_;

    say Dump +{
        name => $name,
        arg => $arg,
        col => $col,
    };
    
    return sub {
        my ($str, $length) = @_;
        $length ||= $arg->{length};
        trunc($str, $length);
    };
}

package main;

use Perl6::Say;

String::Truncate->import(
    'defaults' => +{ length => 4, foo => 3, bar => 5, },
    'custom' => +{ length => 7, foo => 1, bar => 2, },
    'trunc' => undef,
    'trunc' => +{ length => 10, -as => 'trunc10' },
);

say trunc("My name is ZIGOROu.", 4);
say trunc10("My name is ZIGOROu.");

まぁ実行すると、$arg, $col の意味が分かるはず。

  • $arg は export したいシンボルの隣にある HASHREF の内容が入ってる
  • $col は collectors の名前ごとに指定した HASHREF の内容が入ってる

ってだけですね。

確かに、上手く使うとコードがすっきりしそう。ウマー。

ちなみに collectors は bootstrap 的なメソッドを実行するとかそういう使い方も出来るので、Tutorial, Cookbook は何となく眺めてみるといいかもです。
でもさっきのスライドが一番良いと思いますw

*1:300 ページを超えるスライド!