HTTP::MobileAgentのエンハンスメント

HTTP::MobileAgentのエンハンスメント

ここは空気を読まない人達が HTTP::MobileAgent の拡張について考える wiki ページです。

拡張の方式

メソッド追加系

unshift @{"$class\::ISA"}, $class;

でいく?

Flash とか、画像とかみたく、キャリヤごとに判別方法が違う場合などは、HTTP::MobileAgent::EzWeb とかの ISA につっこみたくならん?

案1
package HTTP::MobileAgent::Plugin::TestPlugin;
use strict;
use warnings;

sub register {
    my ( $self, $context ) = @_;

    $context->register_method(
        'test_meth' => {
            DoCoMo   => 0,
            EZweb    => 1,
            Vodafone => sub { shift->is_type_w ? 1 : 0 },
        }
    );
}

1;
案2

名前空間の汚染を防ぐために、こういう作戦はどうよ?

でもなんかキモい気がする。

HTTP::MobileAgent->new($staff, { plugins => [], mkclass => 'Proj::MobileAgent' });
sub new {
    my($class, $stuff, $opt) = @_;
    if (ref $stuff eq 'HASH' && !$stuff->{HTTP_USER_AGENT}) { $opt = $stuff; $stuff = undef; } # ここキモすぎ
    my $request = HTTP::MobileAgent::Request->new($stuff);

    # parse UA string
    my $ua = $request->get('User-Agent');
    my $sub = 'NonMobile';
    if ($ua =~ /$MobileAgentRE/) {
        $sub = $1 ? 'DoCoMo' : $2 ? 'JPhone' : $3 ? 'JPhone' : $4 ? 'JPhone' : $5 ? 'EZweb' :  'AirHPhone';
    }

    my $self = bless { _request => $request }, "$class\::$sub";

    # たとえば
    $self = bless $self, $opt->{mkclass} if $opt->{mkclass};
    if ($opt->{plugins}) {
        no strict 'refs';
        my $mkclass = $opt->{mkclass} || $class;
        unshift @{"$mkclass\::ISA"}, reverse @{ $opt->{plugins} };
    }

    $self->parse;
    return $self;
}

こうすることにより、名前空間の汚染を防ぐ作戦。

フック系

User Agentの解析にある処理を挟む

これのための機能なんだけど、必要かどうか微妙。本体の方にとりこむべき?

あたりが選択肢だけど、つけるとしたら、Class::Trigger の方がよいと思われ。

既存のアプリケーションの扱い

  • C::P::MobileAgent
  • T::P::MobileAgent
  • S::P::MobileAgent

とかでも恩恵をうけられるようにしたい。

でも、いずれの開発者コンタクト可能(#ja.cpan or #catalyst-ja で)なので、コードの方変えてもらうことも可能。

適当だけど、C::P::MobileAgent の場合

my $hma = eval { $c->config->{mobile_agent}->{mk_class} } || 'HTTP::MobileAgent';
$c->req->mobile_agent($hma->new($c->req->user_agent));

みたいなイメージか。

拡張したい機能一覧

  • Basic認証がスムーズに行える?
  • Flash対応してる?
    • Lite1.1 対応してる?
  • MAX_PDU も見たい
  • Cookie 対応状況
  • トルカ対応
  • PDF対応