module Tailor::CompositeObservable
Used by {Tailor::Lexer} to provide publishing methods for observers. Any Ruler
that wants to subscribe to Lexer
events must use the methods defined here.
Public Class Methods
define_observer(name)
click to toggle source
Defines three instance methods that provide for observing a {Tailor::Lexer} object. If name
was passed “test”:
-
#add_test_observer
-
#test_update
-
#notify_test_observers
@param [String] name The name of event to observe/subscribe to.
# File lib/tailor/composite_observable.rb, line 16 def self.define_observer(name) define_method("add_#{name}_observer") do |observer| @notifiers = {} unless defined? @notifiers @notifiers[name] = {} unless @notifiers[name] call_back = "#{name}_update".to_sym unless observer.respond_to? call_back raise NoMethodError, "observer '#{observer}' does not respond to '#{call_back}'" end @notifiers[name][observer] = call_back end define_method("notify_#{name}_observers") do |*args| if defined? @notifier_state and @notifier_state if @notifier_state[name] if defined? @notifiers and @notifiers[name] @notifiers[name].each do |k, v| k.send(v, *args) end end end end end define_method("#{name}_changed") do @notifier_state = {} unless defined? @notifier_state @notifier_state[name] = true end end