Cocoa::EventLoop

そういえば Cocoa::EventLoop と言うモジュールを書いたんでした。

これはもともと AnyEvent::Impl::NSRunLoop として書いていたイベントループ処理部分だけを単体モジュールとして切り出した物で、 AnyEvent を使わなくても Cocoa のイベントループを Perl から使用できるというものです。

くわしくはドキュメントを参照してもらうとして、Cocoa::Growl を使ったサンプルを載せてみます:

use Cocoa::EventLoop;
use Cocoa::Growl;

my $done = 0;
growl_notify(
    name        => 'Notification Name',
    title       => 'Hello',
    description => 'Cocoa World!',
    on_click    => sub {
        $done++;
    },
    on_timeout => sub {
        $done++;
    },
);

Cocoa::EventLoop->run_while(0.1) while !$done;

これを AnyEvent で書くと:

use AnyEvent 5.30;
use Cocoa::EventLoop;
use Cocoa::Growl;

my $cv = AnyEvent->condvar;
growl_notify(
    name        => 'Notification Name',
    title       => 'Hello',
    description => 'Cocoa World!',
    on_click    => sub {
        $cv->send;
    },
    on_timeout => sub {
        $cv->send;
    },
);

$cv->recv;

ほぼ一緒ですね。 また、この例ではわからないですがtimerやioのインタフェースもAnyEventに合わせてあるのでほとんど同じ感じで使うことができます。

ただまぁ、AnyEventには豊富なライブラリがあるため、上記のGrowlのサンプル以上に複雑なことをする場合は素直にAnyEventを使うのがいいかと思います。

by typester / at 2011-01-04T10:30:00 / perl · osx / Comments(0)