理系学生日記

おまえはいつまで学生気分なのか

WebService::LivedoorReader の進捗

まだできあがってないのでアレなのですが、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;

いまのところ、この方針でコーディングをすすめてます。あといつもの通りエラー処理とかがクソなかんじなので、なんとかしないといけない。