まだできあがってないのでアレなのですが、Moose を使って WebService::LivedoorReader を書き直しています。
絶対にしたいと思ってたのが、メソッドチェーンで(ある程度)つなげるようにしたい!! ってことで、これはなんでかっていうと、気分だけの問題です。メソッドチェーンにすると意味もなくカッコいい気がした。
まだ github にもあげてなくて、これはなんでかっていうと、やっぱしあんまし意味はないです。
例えば、購読している全フィードを出力しようと思うと、こういう感じで書きます。
use strict; use warnings; use WebService::LivedoorReader; use feature qw(say); binmode STDOUT => ':utf8'; my $ldr = WebService::LivedoorReader->new( user => 'username', pass => 'password', ); my $cnt = 0; $ldr->feeds->each( sub { my $self = shift; say join ":" => $cnt++, $self->title, $self->link; });
% perl -I../lib core.pl | tail -3 615:JPerl Advent Calendar 2009:http://perl-users.jp/articles/advent-calendar/2009/ 616:Casual Track - JPerl Advent Calendar 2009:http://perl-users.jp/articles/advent-calendar/2009/casual/ 617:2009 Perl Advent Calendar:http://www.perladvent.org/2009/
ピンを立てたエントリの RSS を全部出力させようと思うとこうかな。
$ldr->pins->each( sub { my $self = shift; say $self->title; $self->discoveries->each( sub { my $self = shift; say "\t", $self->feedlink; }); });
% perl -I../lib core.pl | head Plack::Requestとか使って小さなWebアプリを作ろう! http://perl-users.jp/articles/advent-calendar/2009/casual/index.xml CCCの「Tポイント」システム、Oracleで刷新 - ITmedia エンタープライズ http://rss.itmedia.co.jp/rss/1.0/enterprise.xml linuxでバックグラウンド処理を便利にするコマンド+おまけ - ゆどうふろぐ http://d.hatena.ne.jp/Yudoufu/rss http://d.hatena.ne.jp/Yudoufu/rss2 [emacs][git] Emacs と git を使っているなら magit を使うべき - mat_akiの日記 http://d.hatena.ne.jp/mat_aki/rss http://d.hatena.ne.jp/mat_aki/rss2
LDR の持つ各 API の機能は、ほぼ全て Moose::Role の形で作ってみています。例えばこれは、購読している全フィードを取得する /api/subs API をたたく WebService::LivedoorReader::Role::Subscribe の定義。
package WebService::LivedoorReader::Role::Subscribe; use WebService::LivedoorReader::Status; use Moose::Role; use Carp; requires 'core'; no Moose::Role; sub subscribe { my ($self, $feedlink) = @_; $feedlink ||= $self->feedlink confess "feedlink must be specified." unless $feedlink; WebService::LivedoorReader::Status->new( $self->core->request( '/feed/subscribe' => { feedlink => $feedlink }) ); } 1;
なんで Role にしているかっていうと、以下のように、WebService::LivedoorReader からも、WebService::LivedoorReader::Discovery からも subscribe を呼びたいというような欲求が良く起こったからです。イチイチ両方のクラスに同じようなメソッドを定義するのもメンドいなーって思ったときに、Moose::Role 使ったら解決するんじゃね?って思いました。
my $ldr = WebService::LivedoorReader->new( hogehoge ); $ldr->subscribe( 'http://d.hatena.ne.jp/kiririmode/rss' ); # WebService::LivedoorReader::Discovery を取得 my $discovery = $ldr->discovery( 'http://d.hatena.ne.jp/kiririmode' ); $discovery->subscribe;
いまのところ、この方針でコーディングをすすめてます。あといつもの通りエラー処理とかがクソなかんじなので、なんとかしないといけない。