読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

MVCその7.5

少し続き。
見返してみたら前回のがあまりにだめだったんでもうちょっと考えてみる。
追記しようかとも思ったけど、反省も含めて残しておこう。
以下、Mooseについて調べたりしたこと。

attribute

Mooseはattributeという形で、インスタンス変数が作成できる。

use Moose;
has 'title' => (
  is => 'rw', # read/write
  isa => 'Str',
);

is => 'ro' ならread onlyで最初に値を入れた後は変更できない。
変えようとすると例外が投げられる。
あとlazy => 1 で遅延評価するなら、default => 'hoge'が必要。


といろいろ分かったけど、今回のSearch.pm専用の属性っているのか?、と考えた。
なんかいらない気がしたので、外して、検索メソッドが返すのはただの無名ハッシュにした。

lib/MyHatena/Web/Model/Tag/Search.pm
#has 'title' => (
#  is => 'rw',
#  isa => 'Str',
#);
#has 'link' => (
#  is => 'rw',
#  isa => 'Str',
#);

  my @entries;
  for my $entry (@{$xml->{item}}) {
    push @entries, {
      title       => encode('utf8', $entry->{title}),
      link        => $entry->{link},
      description => encode('utf8', $entry->{description}),
      users_link  => $HATENA_USERS_API.$entry->{link},
      users_img   => $HATENA_USERS_IMG_API.$entry->{link},
      favicon_img => $HATENA_FAVICON_IMG_API.$entry->{link},
    };
  }

MooseX::Params::Validate

気になってた引数のバリデーション。
拡張のMooseX::Params::Validateを使ってみる。

lib/MyHatena/Web/Model/Tag/Search.pm
#use Params::Validate;
#my ($query) = eval {
#  validate_pos(@_, { type => SCALAR })
#};

use MooseX::Params::Validate;
my ($query) = eval pos_validated_list(\@_, { isa => 'Str' });

がこれが良くなくって、何を渡しても「1」が$queryに入ってしまう。
あ、posse_validated_list()って中でwantarray的なことをしててevalのreturnをscalarでとっているのかなと思って、eval外したらうまくいった。

my ($query) = pos_validated_list(\@_, { isa => 'Str' });

じゃあ、プログラム実行中にこのサブルーチンに文字列じゃない値が入ったら例外が飛ぶ訳だけど、それってどういう制御すればいいんかな。
これも課題かなー。
Catalystのエラーハンドリングはまださっぱり。

あと気になったのが、空文字列がisa => 'Str'で通ってるみたいで、ちょっと困る。
確かに空「文字列」なんだけれども。
何も検索語句が入ってなかったら、このバリデートでひっかけようかと思ってたけど、できるのかどうかやっぱりまだよくわからない手探り状態進行中。