Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2008-03-05

[開発ログ]プラグインのフック

複雑なので修正。

before

  @@hook_plugins = Hash[ *%w(
    before_content after_content before_entry after_entry before_entries after_entries
  ).inject([]) {|t, e| t << e.to_sym; t << []; t } ]
  def self.add_hook(key, priority = 128, &block)
    @@hook_plugins[key] << block
  end

  def self.render_hook(key, *args)
    %Q!<div class="#{key}">#{ @@hook_plugins[key.to_sym].map {|e| e.call(*args) }.join("\n") }</div>!
  end

after

  @@hook_procs = {}
  def self.add_hook(key, priority = 128, &block)
    @@hook_procs[key] ||= []
    @@hook_procs[key] << block
  end

  def self.render_hook(key, *args)
    @@hook_procs[key] or return ''
    @@hook_procs[key].map {|e| e.call(*args) }.join("\n")
  end

存在しないエントリーポイントに対して、render_hookしたときにエラーにしたかったんだけど、その機能はカット。

divタグで囲むのをやめた。 divタグなしのフックエントリを挿入できなくて悩んでたけど、 その辺はビューで解決すべきと判断した。

priorityは未実装。 プラグインの実行順序は、ファイル名で操作できるからいらない気もする。

after2

@@hook_procs[key] or return ''
@@hook_procs[key].map {|e| e.call(*args) }.join("\n")

上の部分はもうちょっとなんとかならないか。

@@hook_procs[key] ? @@hook_procs[key].map {|e| e.call(*args) }.join("\n") : ''

1行になった。

(a = @@hook_procs[key]) ? a.map {|e| e.call(*args) }.join("\n") : ''

ちょっと短くなった。

(@@hook_procs[key] or []).map {|e| e.call(*args) }.join("\n")

さらに短くできた!

(@@hook_procs[key] or []).map(&:call, *args).join("\n")

こうは書けないんだよなあ。 Symbol#to_procに引数を渡すのできないよね?