Class::Trigger::Ordered を作る(前に)

# はじめに:このモジュールがキモく感じるのはなぜだろう?


以前にmiyagawaさんが Class::Trigger をオーバーホールすると言われていたので待っていたんですけれど、あの時アイデアをフィードバックしなかったのは我ながらイタイ。。

ショボくても構わないから、いつまでも引き篭もってないでアウトプットしる>自分
そうしないと成長できないよ。。。


と思ったので、今回はまず SYNOPSIS から先に書いてみる。

  ## Super Class
  package Hoge;
  use strict;
  use Class::Trigger::Ordered;
# (or) use base qw/Class::Trigger::Ordered/;

  # noncompliant method
  __PACKAGE__->add_triggerpoints(qw{
    INIT_HOOK MIDDLE_HOOK FINAL_HOOK
  });

  sub new { bless {}, shift }

  sub run {
    my $self = shift;
    $self->call_trigger('INIT_HOOK');
    $self->call_trigger('MIDDLE_HOOK');
    $self->call_trigger('FINAL_HOOK');
  }

  ## Inherit Class
  package Hoge::Moge;
  use base qw/Hoge/;

  __PACKAGE__->add_trigger(
    'INIT_HOOK:20'   => sub { print "hoge1\n" },
    'MIDDLE_HOOK:20' => sub { print "moge1\n" },
    'MIDDLE_HOOK:80' => sub { print "moge3\n" },
  );

  # or singular registration
  __PACKAGE__->add_trigger('INIT_HOOK', sub { print "hoge2\n" }, 21);
  __PACKAGE__->add_trigger('MIDDLE_HOOK' sub { print "moge2\n" }, 20); # push to (MIDDLE_HOOK -> 20)


  ## Main
  package main;
  use Hoge::Moge;

  my $hoge = Hoge::Moge->new;

  # this instance only
  $hoge->add_trigger('FINAL_HOOK:20' => sub { print "hoge last!\n" });

  $hoge->run;

hoge1
hoge2
moge1
moge2
moge3
hoge last!

※ あー、今あらためて書くと、Class::Trigger が継承する形式じゃないのは僕としてはちょっと不思議。わざわざクラスにメソッドを作ってあげてるんですね。mixin/pluggable についてもっと理解を深めないと。

※ 追記: 継承じゃないのは import 時に caller を確実に取るためっていうのも一因?気付けorz


…こんな感じでしょうか?
ちょっと今は作業できないけど今晩中に作るよー。>自分