時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

Data::Validator::Managerなるものを書いてみた。

メソッドや関数の引数をバリデーションするときにData::Validatorを使わせて貰っているのですが、
低レベルAPIと高レベルAPIで同じバリデーションルールを適用したい事があって、
そういうときに複数箇所にコピペして使ったりしていると、
低レベルAPIのインターフェースを変えたくなったときにそれに依存している高レベルAPIのバリデーションルールも変える必要があってだるかったり、
そもそもクローンとも言えるオブジェクトが複数ヶ所で静的変数に保持されているのは無駄なのではないか。
あと、そもそも5.10未満では静的変数は使えないので5.8しか使えない環境とかで使いたくなったとき困るのではないか*1とか、そんな事を思ったので、
そんな問題を解消するモジュールを書いてみました。

PrePAN: http://prepan.org/module/429En4oFcf
Github: https://github.com/karupanerura/p5-Data-Validator-Manager

使い方は簡単で、以下のようにDSLでルールを定義して、

package Example::Validator;
use strict;
use warnings;
use utf8;

use Data::Validator::Manager::Declare;

rule model_get => +{
    key => 'Str'
} => with(qw/Method/);

1;

自分用のバリデーションモジュールからvalidateをexportしてきて使う。

package Example::Model;
use strict;
use warnings;
use utf8;

use Example::Validator qw/validate/;

sub get_with_cache {
    my($self, $args) = validate(model_get => @_);

    my $val = $self->cache->get($args->{key});
    return $val if defined $val;

    $val = $self->get($args);
    $self->cache->set($args->{key} => $val);

    return $val;
}

sub get {
    my($self, $args) = validate(model_get => @_);

    return $self->backend->get($args->{key});
}

sub delete_cache {
    my($self, $args) = validate(model_get => @_);

    return $self->cache->delete($args->{key});
}

1;

ね、簡単でしょ?


ちなむと、
NoThrow使いたいときとかはget_rule('rule_name')でData::Validatorのオブジェクトを取ってこれるので、それが使えます。


個人的にはこういうのあると凄く嬉しいんですが、他の人はどうなのかなと思ったので、
とりあえずPrePANにあげてみました。
良かったらgoodするなりlikeするなりしてください!

*1:静的変数無くても使えるは使えますが、毎度オブジェクトを生成するのは嫌だったり、オブジェクトを使いまわすために汚い書き方をするのは嫌だったり