Module: Observer

Included in:
BlockObserver, ListSelectionBinding, ModelBinding, ObservableModel::Updater, TableItemsBinding, TreeItemsBinding, WidgetBinding
Defined in:
lib/command_handlers/models/observer.rb

Overview

Mixin representing Observer trait from Observer Design Pattern Allows classes to include without interfering with their inheritance hierarchy.

Instance Method Summary collapse

Instance Method Details

#add_dependent(parent_to_dependent_hash) ⇒ Object

add dependent observer to unregister when unregistering observer



65
66
67
68
69
# File 'lib/command_handlers/models/observer.rb', line 65

def add_dependent(parent_to_dependent_hash)
  observable, property = registration = parent_to_dependent_hash.keys.first
  dependent_observer, dependent_observable, dependent_property = dependent = parent_to_dependent_hash.values.first
  dependents_for(registration) << dependent
end

#dependentsObject

mapping of registrations to dependents property] => [[dependent, dependent_observable, dependent_property], …]



17
18
19
# File 'lib/command_handlers/models/observer.rb', line 17

def dependents
  @dependents ||= Hash.new
end

#dependents_for(registration) ⇒ Object



21
22
23
# File 'lib/command_handlers/models/observer.rb', line 21

def dependents_for(registration)
  dependents[registration] ||= Set.new
end

#register(observable, property = nil) ⇒ Object Also known as: observe

registers observer in an observable on a property (optional) observer maintains registration list to unregister later



27
28
29
30
31
32
# File 'lib/command_handlers/models/observer.rb', line 27

def register(observable, property = nil)
  observable.add_observer(*[self, property].compact)
  [observable, property].tap do |registration|
    self.registrations << registration
  end
end

#registrationsObject



7
8
9
# File 'lib/command_handlers/models/observer.rb', line 7

def registrations
  @registrations ||= Set.new
end

#registrations_for(observable, property = nil) ⇒ Object



11
12
13
# File 'lib/command_handlers/models/observer.rb', line 11

def registrations_for(observable, property = nil)
  registrations.select {|o, p| o == observable && p == property}
end

#remove_dependent(parent_to_dependent_hash) ⇒ Object



71
72
73
74
75
# File 'lib/command_handlers/models/observer.rb', line 71

def remove_dependent(parent_to_dependent_hash)
  observable, property = registration = parent_to_dependent_hash.keys.first
  dependent_observer, dependent_observable, dependent_property = dependent = parent_to_dependent_hash.values.first
  dependents_for(registration).delete(dependent)
end

#unregister(observable, property = nil) ⇒ Object Also known as: unobserve



35
36
37
38
39
40
41
42
43
44
# File 'lib/command_handlers/models/observer.rb', line 35

def unregister(observable, property = nil)
  observable.remove_observer(*[self, property].compact)
  registration = [observable, property]
  dependents_for(registration).each do |dependent|
    dependent_observer, dependent_observable, dependent_property = dependent
    dependent_observer.unregister(dependent_observable, dependent_property)
    remove_dependent(registration => dependent)
  end
  registrations.delete(registration)
end

#unregister_all_observablesObject Also known as: unobserve_all_observables

cleans up all registrations in observables



57
58
59
60
61
# File 'lib/command_handlers/models/observer.rb', line 57

def unregister_all_observables
  registrations.each do |observable, property|
    unregister(observable, property)
  end
end

#unregister_dependents_with_observable(registration, dependent_observable) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/command_handlers/models/observer.rb', line 47

def unregister_dependents_with_observable(registration, dependent_observable)
  thedependents = dependents_for(registration).select do |d_observer, d_observable, d_property|
    d_observable == dependent_observable
  end
  thedependents.each do |d_observer, d_observable, d_property|
    d_observer.unregister(d_observable, d_property)
  end
end

#update(changed_value) ⇒ Object



77
78
79
# File 'lib/command_handlers/models/observer.rb', line 77

def update(changed_value)
  raise 'Not implemented!'
end