module LIFX::LAN::Observable

@private

Public Instance Methods

add_observer(obj, type, &callback) click to toggle source
# File lib/lifx/lan/observable.rb, line 8
def add_observer(obj, type, &callback)
  if !callback_type_exists?(type)
    raise ObserverCallbackNotFound.new("Callback #{type} not found in #{observer_callback_definition.keys}")
  end
  if !callback_has_required_keys?(type, callback)
    raise ObserverCallbackMismatch.new
  end
  observers[type][obj] = callback
end
callback_has_required_keys?(type, callback) click to toggle source
# File lib/lifx/lan/observable.rb, line 39
def callback_has_required_keys?(type, callback)
  (required_keys_for_callback(type) - required_keys_in_proc(callback)).empty?
end
callback_type_exists?(type) click to toggle source
# File lib/lifx/lan/observable.rb, line 35
def callback_type_exists?(type)
  !!observer_callback_definition[type]
end
notify_observers(type, **args) click to toggle source
# File lib/lifx/lan/observable.rb, line 26
def notify_observers(type, **args)
  if !callback_type_exists?(type)
    raise ObserverCallbackNotFound.new("Callback #{type} not found in #{observer_callback_definition.keys}")
  end
  observers[type].each do |_, callback|
    callback.call(**args)
  end
end
observer_callback_definition() click to toggle source
# File lib/lifx/lan/observable.rb, line 43
def observer_callback_definition
  {}
end
observers() click to toggle source
# File lib/lifx/lan/observable.rb, line 61
def observers
  @_observers ||= Hash.new { |h, k| h[k] = {} }
end
remove_observer(obj, type) click to toggle source
# File lib/lifx/lan/observable.rb, line 18
def remove_observer(obj, type)
  observers[type].delete(obj)
end
remove_observers() click to toggle source
# File lib/lifx/lan/observable.rb, line 22
def remove_observers
  observers.clear
end
required_keys_for_callback(type) click to toggle source
# File lib/lifx/lan/observable.rb, line 47
def required_keys_for_callback(type)
  @_required_keys_for_callback ||= {}
  @_required_keys_for_callback[type] ||= begin
    return [] if !observer_callback_definition[type]
    required_keys_in_proc(observer_callback_definition[type])
  end
end
required_keys_in_proc(proc) click to toggle source
# File lib/lifx/lan/observable.rb, line 55
def required_keys_in_proc(proc)
  proc.parameters.select do |type, _|
    type == :keyreq
  end.map(&:last)
end