class Pluggaloid::Event

Attributes

filter_another_thread[RW]
vm[RW]
options[RW]

オプション。以下のキーを持つHash

:prototype

引数の数と型。Arrayで、type_strictが解釈できる条件を設定する

:priority

Delayerの優先順位

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# File lib/pluggaloid/event.rb, line 13
def initialize(*args)
  super
  @options = {}
  @listeners = []
  @filters = [] end

Private Class Methods

__clear_aF4e__()
Alias for: clear!
clear!() click to toggle source
# File lib/pluggaloid/event.rb, line 102
def clear!
  @filter_another_thread = false
  __clear_aF4e__()
end
Also aliased as: __clear_aF4e__

Public Instance Methods

add_filter(event_filter) click to toggle source

イベントフィルタを追加する

Args

event_filter

イベントフィルタ(Filter)

Return

self

# File lib/pluggaloid/event.rb, line 77
def add_filter(event_filter)
  unless event_filter.is_a? Pluggaloid::Filter
    raise Pluggaloid::ArgumentError, "First argument must be Pluggaloid::Filter, but given #{event_filter.class}." end
  @filters << event_filter
  self end
add_listener(listener) click to toggle source
# File lib/pluggaloid/event.rb, line 60
def add_listener(listener)
  unless listener.is_a? Pluggaloid::Listener
    raise Pluggaloid::ArgumentError, "First argument must be Pluggaloid::Listener, but given #{listener.class}." end
  if @listeners.map(&:slug).include?(listener.slug)
    raise Pluggaloid::DuplicateListenerSlugError, "Listener slug #{listener.slug} already exists." end
  @listeners << listener
  self end
call(*args) click to toggle source

イベントを引数 args で発生させる

Args

*args

イベントの引数

Return

Delayerか、イベントを待ち受けているリスナがない場合はnil

# File lib/pluggaloid/event.rb, line 34
def call(*args)
  if self.class.filter_another_thread
    if @filters.empty?
      vm.Delayer.new(*Array(priority)) do
      call_all_listeners(args) end
    else
      Thread.new do
        filtered_args = filtering(*args)
        if filtered_args.is_a? Array
          vm.Delayer.new(*Array(priority)) do
            call_all_listeners(filtered_args) end end end end
  else
    vm.Delayer.new(*Array(priority)) do
      args = filtering(*args) if not @filters.empty?
      call_all_listeners(args) if args.is_a? Array end end end
delete_filter(event_filter) click to toggle source

イベントフィルタを削除する

Args

event_filter

イベントフィルタ(EventFilter)

Return

self

# File lib/pluggaloid/event.rb, line 88
def delete_filter(event_filter)
  @filters.delete(event_filter)
  self end
delete_listener(event_filter) click to toggle source
# File lib/pluggaloid/event.rb, line 68
def delete_listener(event_filter)
  @listeners.delete(event_filter)
  self end
filtering(*args) click to toggle source

引数 args をフィルタリングした結果を返す

Args

*args

引数

Return

フィルタされた引数の配列

# File lib/pluggaloid/event.rb, line 55
def filtering(*args)
  catch(:filter_exit) {
    @filters.reduce(args){ |acm, event_filter|
      event_filter.filtering(*acm) } } end
priority() click to toggle source

イベントの優先順位を取得する

Return

プラグインの優先順位

# File lib/pluggaloid/event.rb, line 25
def priority
  if @options.has_key? :priority
    @options[:priority] end end
vm() click to toggle source
# File lib/pluggaloid/event.rb, line 19
def vm
  self.class.vm end

Private Instance Methods

call_all_listeners(args) click to toggle source
# File lib/pluggaloid/event.rb, line 93
def call_all_listeners(args)
  catch(:plugin_exit) do
    @listeners.each do |listener|
      listener.call(*args) end end end