Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-04-30

Moose::Roleのインターフェースとしての役

Moose::Roleのインターフェースとしての役 - dann@catalyst を含むブックマーク はてなブックマーク - Moose::Roleのインターフェースとしての役 - dann@catalyst Moose::Roleのインターフェースとしての役 - dann@catalyst のブックマークコメント

かっちり作りたいときに「これはインターフェースですよ」と明示する仕組みが重要で、JavaInterfaceは優れた言語仕様の一つです。Moose::Roleは、そのInterfaceとしての役割を果たしています(一応、Mixinとしての役割も)。

このMoose::RoleのInterfaceの仕組みは、実装するべき箇所を明文化するのにとても向いています。特にフレームワークを作りたい場合には、役に立つと思います。

YAPC::AsiaでもMooseでフレームワーク作ろうみたいなセッションがあったような。そこだけ聞きたいな。今ならid:tokuhiromさんのMoose版HTTP::Engineが、フレームワークにどうMooseを使うのかのわかりやすい例かも。特にMoose::Roleの使い方は。

# Mooseは、Perlの言語仕様にあったほうがよいものを補完する仕組みが色々とあって、いいなぁと思う今日この頃。OOシンタクス補完もその一つだけれど、それだけだと思われてしまうとすごい勿体無い仕組みだなぁと。

Moose::Autoboxの拡張

Moose::Autoboxの拡張 - dann@catalyst を含むブックマーク はてなブックマーク - Moose::Autoboxの拡張 - dann@catalyst Moose::Autoboxの拡張 - dann@catalyst のブックマークコメント

Moose::Autobox->mixin_additional_roleでオレオレ拡張ができるようになってます。Moose::Autobox::Arrrayとかに足りないけど追加したいってメソッドは、これで生やしていくのがいいのかも。

以下例。

#!/usr/bin/env perl
use strict;
use warnings;
use Moose::Autobox;

{
    package    # hide me from PAUSE
        Moose::Role::List::More;
    use Moose::Role;
    use Moose::Autobox;
    use List::Util;
    use List::MoreUtils;

    sub sum {
        my ($array) = shift;
        List::Util::sum(@$array);
    }

    sub minstr {
        my ($array) = shift;
        List::Util::minstr(@$array);
    }

    sub maxstr {
        my ($array) = shift;
        List::Util::maxstr(@$array);
    }

    sub true {
        my ( $array, $sub ) = @_;
        List::MoreUtils::true { $sub->($_) } @$array;
    }

    sub false {
        my ( $array, $sub ) = @_;
        List::MoreUtils::false { $sub->($_) } @$array;
    }

}

Moose::Autobox->mixin_additional_role( ARRAY => 'Moose::Role::List::More' );
use Perl6::Say;

say [ 1, 2, 3 ]->sum;
say [ 1, 2, 3 ]->minstr;
say [ 1, 2, 3 ]->maxstr;
say [ 1 .. 10 ]->true( sub { defined($_) } );
say []->false( sub { defined($_) } );

# ActiveSupportっぽいのほしいなぁ。

LorenzoLorenzo2012/10/30 18:26Was totally stuck until I read this, now back up and rnuinng.

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080430