操作方法

最近やった事

CodeRepos始めた

コミッタ40人

typester++

ustreamで新ジャンル作った

札コラ

あと

Assurerの

コマンドバージョン
監視版作りたい

って事で本題

Class::Component序章

Yappo: ko@yappo.ne.jp
Shibuya Perl Mongers

Agenda

Class::Componentって?

Class::ComponentとはNumber::Objectのドラフト版を作ってた時に、malaに「てんさい」と言われて調子に乗ってNumber::Objectのプラガブルな部分だけを取り出して作ったモジュール

Soozyカンファレンスのnaoyaいじりネタの時に、この事実を告白したらmalaが「そんな事言ってたっけ?」とか言われてちょっとナイーブになったというモジュール

プラガブルっぽいモジュールを比較的楽に作る為のベースモジュール

mala起源

Class::Componentは

Plagger,Catalyst,DBICの

プラガブルなところだけ
盗んで

Class::Accessorみたく
他から利用出来るようにした
モジュール

使い方

Simple Example

package Naoya;
use strict;
use warnings;
use Class::Component;
1;
# これだけでプラガブルアプリケーションに!

useするだけで使える!

どこがプラガブル?

拡張ポイント

これら三要素を拡張

説明

Component

CatalystのPluginっぽいの

Class::Component::_load_component

# Class::Componentより引用
no strict 'refs';
unshift @{"$c\::ISA"}, $pkg;
#@ISAにunshiftしてcomponentを継承
#@ISAを太らせていくCatalystのPluginみたいなの

モジュールの根っこの
機能を取っ替えひっかえ
したい時使う

標準で何個かComponent
付いてます。今回も省略
(Pod見てね)

プラガブルじゃないよね

Plugin

Plaggerのhookみたいなの

DBICのメソッド拡張

二つできる

メソッド拡張
Example

hatena.pl

use strict;
use warnings;
use Naoya;
Naoya->new->bell;

Naoya.pm

package Naoya;
use strict;
use warnings;
use Class::Component config =>
    { Jitensya => { sound => 'チリンチリン' } };
# jitensyaプラグインにhashrefでconfigを設定
1;

Naoya.pm

use Class::Component config =>
    { Jitensya => { sound => 'チリンチリン' } };
__PACKAGE__->load_components(
    qw/ Autocall::InjectMethod /
);
# プラグインで定義したメソッドを生やすComponent
1;

Naoya.pm

__PACKAGE__->load_components(
    qw/ Autocall::InjectMethod /
);
__PACKAGE__->load_plugins(qw/ Jitensya /);
# Jitensya プラグインをロード

Naoya.pm

package Naoya;
use strict;
use warnings;
use Class::Component config =>
    { Jitensya => { sound => 'チリンチリン' } };
__PACKAGE__->load_components(
    qw/ Autocall::InjectMethod /
);
__PACKAGE__->load_plugins(qw/ Jitensya /);
1;

Naoya/Plugin/Jitensya.pm

sub bell : Method {
    my($self, $context, @args) = @_;
    say $self->config->{sound};
}
# Attribute::Methodを使ってプラグインメソッドを定義

Naoya/Plugin/Jitensya.pm

sub bell : Method {
    my($self, $context, @args) = @_;
    say $self->config->{sound};
}
# Naoya.pm で設定したconfigを利用

Naoya/Plugin/Jitensya.pm

package Naoya::Plugin::Jitensya;
use strict;
use warnings;
use base 'Class::Component::Plugin';
use Perl6::Say;
sub bell : Method {
    my($self, $context, @args) = @_;
    say $self->config->{sound};
}
1;

実行するとチリンチリン
と音がなります

Hook Example

Naoya/Plugin/Jitensya.pm

# 追加する
sub kernel : Hook('hacker') {
    my($self, $context, @args) = @_;
    say 'kernel大好き!';
}
# Attribute::Hook を使ってフックポイント追加

hatena.pl

use strict;
use warnings;
use Naoya;
Naoya->new->bell;
Naoya->new->run_hook('hacker');
# hackerのフックポイント実行

実行するとチリンチリン
と音がなった後
Kernel大好き!と
叫びます

Attribute

Pluginのメソッドに
彩りを与えます

CatalystのControllerっぽい
アレですアレ

Catalyst::DispatchType::*を
追加してChaindとか
Regexpみたいのを
追加出来るアレ


この意味わかりますか?

Konoimi Example

Naoya/Attribute/Jkondo.pm

package Naoya::Attribute::Jkondo;
use strict;
use warnings;
use base 'Class::Component::Attribute';
sub register {
    my($class, $plugin, $c, $method, $value) = @_;
    $plugin->config->{sound} = 'わいが近藤や';
    # config->{sound}の中身を強制的に上書き
}
1;

Naoya/Plugin/Jitensya.pm

sub bell : Method : Jkondo {
    my($self, $context, @args) = @_;
    say $self->config->{sound};
}
# Attribute::Jkondoも追加

実行するとチリンチリン
ではなく
わいが近藤やと
怒鳴ります

Attributeを追加してくと
Pluginに面白い事させられる

宣伝

gihyo.jpで連載やります

あと、前回IT Proの時にはてなすたーのしゃつきてうんたらnaoyaさんをいじったらnaoyaさんがちょっと怒ってたから、今回ははてなすたーのしゃつきてはてなブックマークの宣伝すれば許して貰えそうだけど、配信にきをとられてなにもできんかた

はてブ

おしまい!