Practice of Programming

プログラム とか Linuxとかの話題

Util::Any 0.12

バージョンあげまくってしまった... orz すみませんm(__)m。
結構テストは書いてたつもりなんですが、基本的な機能のテストが甘かったっていう。ぼけぼけな感じ。

0.08 - 0.12までで、変わったところを列挙します。

継承できるモジュールにSub::Exporterを追加しました(0.08)

でも、Util::Anyと一緒に使うのはあんまりおすすめしませんが。
と言うか,継承の実装はいらんかった気がするんだよなぁ...。今更だけど。

種類を指定するのに、-list, -scalar みたいに、- を推奨するようにしました(0.08)

推奨というか、ドキュメントの例はそうしたってだけなんですが。
前から指定はできたのですが、Sub::Exporterにインスパイヤされて。
ただ、これをつけると、preifx => 1 オプションが死んでたので、直しました(0.09)

種類のprefixを自分で指定できるようになりました(0.08)

Sub::Exporterインスパイヤその2

use Util::Any -list => {-prefix => "array_"};

-list => ['uniq'] が動かなくなってた(0.08)ので直した(0.12)

同じ種類に複数のモジュールがあるパターンで死ぬようになってました。

関数ごとのrenameができるようになりました(0.08)

Sub::Exporterインスパイヤその3

use Util::Any -list => {uniq => {-as => "array_uniq"}};

が、バグることがあったので直しました(0.12)。1個上のバグを踏んだ場合に死んだ模様。

smart_rename というのを追加しました(0.10)

prefix => 1だと、関数名に種類が入っている場合に気持ち悪いとか、
is_/has_ 系の関数の前に、prefixがつくのは気持ち悪いので、つけました。

use Util::All -utf8, {smart_rename => 1};

prefix => 1 だと、utf8_is_utf8 になるところが、is_utf8 だけになります。upgrade は、utf8_upgradeになります。smart_rename のロジックは、自分のモジュール作るときに気にくわなければ,オーバーライドできます。

Sub::Exporter の関数ジェネレータをできるようにしました(0.08だけど、ドキュメントとテスト書いたのは0.12)

Sub::Exporterインスパイヤその4。
既存の関数を元に関数ジェネレータを通して,新たな関数をさくっと作り出すみたいな機能があります。


下記、例が微妙に悪い気がしますが...。例が悪かった。ハッシュリファレンスじゃなくて、アレイリファレンスがよいです。アレイリファレンスじゃないと、同じ min に対して、複数のカスタマイズができない。

package main;

use strict;
use lib qw(lib t/lib);
# 訂正前のもの: use Hoge -test => {min => {-as => "min_under_20", under => 20}};
use Hoge -test => [
    min => {-as => "min_under_20", under => 20},
    min => {-as => "min_under_5", under => 5},
];

min_under_20(100,25,30); # 20
min_under_20(100,10,30); # 10
min_under_5(100,25,30); # 5
min_under_5(100,1,30);  # 1

min に、-as => ”importする関数名" として、使います。残りの値(under => 20)は、
定義側(下)で、minに与えたコードリファレンスに渡されます。

package Hoge;

use strict;
use Util::Any -Base;

our $Utils =
  {
   -test => [[
             'List::Util', '',
             { min => \&build_min_reformatter}
            ]]
  };

sub build_min_reformatter {
  # $class は List::Util
  # $name は min
  # $option には、{under => 20} 
  my ($pkg, $class, $name, $option) = @_;
  no strict 'refs';
  my $code = do { no strict 'refs'; \&{$class . '::' . $name}};
  sub {
    my @args = @_;
    $code->(@args, $option->{under});
  }
}

1;

こうすることで、build_min_reformatter が返すコードリファレンスが、-as で指定された名前に割り当てられます。