自作の携帯サイト用アクセス解析ソフト「Episode」の携帯キャリア判定モジュールをMooseでリファクタリングしてみた。色々改善の余地があるコードだけどとりあえず動くので良しとする。
HashRef[Str]型のdefaultの指定方法にめっちゃ苦労した。default = {a=>’a'}ってできなくて、無名サブルーチン使わなきゃいけないらしい。
MooseX::AttributeHelpersを組み込めば、この辺が楽になるのかね?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| package Episode::Request::UserAgent;
use Moose;
use Perl6::Say;
has 'useragent' => (
is => 'rw',
isa => 'Str',
default => '',
required => 1,
);
has 'regex' => (
is => 'ro',
isa => 'HashRef[Str]',
default => sub {
{
docomo => '^DoCoMo',
au => '^(?:KDDI|UP\.Browser\/.+?)-(.+?) ',
softbank => '^(?:SoftBank|Semulator)',
}
},
required => 1,
);
__PACKAGE__->meta->make_immutable;
no Moose;
sub is_mobile {
my $self = shift;
$self->useragent =~ $self->regex->{docomo} ||
$self->useragent =~ $self->regex->{au} ||
$self->useragent =~ $self->regex->{softbank}
? 1 : 0;
}
sub AUTOLOAD {
my $self = shift;
our $AUTOLOAD;
my $pkg = __PACKAGE__ . '::is_';
$AUTOLOAD =~ s/$pkg//;
my $regex = $self->regex->{$AUTOLOAD};
$self->useragent =~ m|$regex| ? 1 : 0;
}
1;
my $ua = 'KDDI-HI31 UP.Browser/6.2.0.5 (GUI) MMP/2.0';
my $req = new Episode::Request::UserAgent;
$req->useragent($ua);
say 'mobile? : ', $req->is_mobile;
say 'docomo? : ', $req->is_docomo;
say 'au? : ', $req->is_au;
say 'softbank? : ', $req->is_softbank; |
結果
mobile? : 1
docomo? : 0
au? : 1
softbank? : 0