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 ページを超えるスライド!