AnyEvent で $poe_kernel->alias_set 的なことをする方法

最近 AnyEvent にはまっています。おもしろい!

AnyEvent と同じ非同期プログラミングフレームワークであるところの POE では

$kernel->alias_set('hoge');

などとしておくと

$kernel->post( hoge => 'state' );

みたいな感じでどこからでもそのコンポーネントを呼び出すことができました。 しかし AnyEvent ではそう言った機能がないため以下のように Object::Container を使って解決することにしました。

呼び出される側:

use AnyEvent;
use Object::Container 'event';

my $cv = AnyEvent->condvar;
$cv->cb(sub {
   my (@args) = $cv->recv;
   # ここになんか処理
});
event->register( foo => sub { $cv } );

呼び出す側:

use AnyEvent;
use Object::Container 'event';

event('foo')->send(@args);

Condvarをグローバルなシングルトンコンテナに入れ、それを使って相互にやりとりをするという感じですね。

Object::Container は export する機能がなかったのですが、毎回 Object::Container->get(...) などとかくのがだるかったので import に引数渡すとその名前でコンテナを export する機能をつけました。(0.2以降)

同等のことはいろいろな方法があると思いますが、これが一応今の所の僕の解となってます。参考までに!

by typester / at 2009-07-09T19:34:00 / perl / Comments(0)