Common Context Object Interface(仮称) について

Application Framework における Context Object が共通のインターフェースを採用することにより、reinventing the wheel をふせぐことができるのではないかという話が先日あがっていたので、ちょっとかんがえてみた。

目的

Application Framework における Context Object が共通の Interface を採用することにより、reinventing the wheel をふせぐ。

定義

new
my $c = MyContext->new();
# or
my $c = MyContext->new(config => {
  'Log::Dispatch' => [
    
  ],
});

クラスメソッド new をもつ。これは、Context Class の instance を作成するメソッドで、引数として %args をとり、返り値はインスタンスである。

config
$c->config->{'Log::Dispatch'};

インスタンスメソッド 'config' をもつ。'config' は hashref である。

利点

CCOI にもとづくプラグインライブラリ集などを作成することが容易となる。

たとえば、以下のような汎用的なロガーよびだし機構を、WAF に依存せずに利用することが可能になる。

package Cleep::Plugin::LogDispatch;
use strict;
use warnings;
use base qw/Exporter/;
our @EXPORT = qw/log/;

sub log {
    my ($self) = @_;
    return $self->{'log'} ||= do {
        my $conf = $self->config->{'Log::Dispatch'};
        Log::Dispatch->new(
            outputs => $self->config->{'Log::Dispatch'},
        );
    };
}

1;

これは、プラグインではあるが、純粋に Exporter なので、以下のように、use するだけで利用できる。

package MyApp;
use Mouse;
use Cleep::Plugin::LogDispatch;

has config => (
  is => 'ro',
  isa => 'HashRef',
  deafult => sub { +{} },
);

no Mouse;__PACKAGE__->meta->make_immutable;

また、CCOI は、Web などに依存していないので、汎用的なアプリケーションで利用することが可能となる。

Published: 2010-07-12(Mon) 04:57