Module: Glimmer::DataBinding::Observer
Overview
Mixin representing Observer trait from Observer Design Pattern Allows classes to include without interfering with their inheritance hierarchy.
Includes a default implementation that can receive an observer block Example: Observer.proc {|new_value| puts new_value} Subclasses may override
Defined Under Namespace
Classes: Proc, Registration
Class Method Summary
collapse
Instance Method Summary
collapse
Class Method Details
.proc(&observer_block) ⇒ Object
36
37
38
|
# File 'lib/glimmer/data_binding/observer.rb', line 36
def proc(&observer_block)
Proc.new(&observer_block)
end
|
Instance Method Details
#add_dependent(parent_to_dependent_hash) ⇒ Object
add dependent observer to unregister when unregistering observer
107
108
109
110
111
|
# File 'lib/glimmer/data_binding/observer.rb', line 107
def add_dependent(parent_to_dependent_hash)
registration = parent_to_dependent_hash.keys.first
dependent = parent_to_dependent_hash.values.first
dependents_for(registration) << dependent
end
|
#call(new_value) ⇒ Object
119
120
121
|
# File 'lib/glimmer/data_binding/observer.rb', line 119
def call(new_value)
raise Error, 'Not implemented!'
end
|
#dependents ⇒ Object
mapping of registrations to dependents property] => [[dependent, dependent_observable, dependent_property], …]
51
52
53
|
# File 'lib/glimmer/data_binding/observer.rb', line 51
def dependents
@dependents ||= Hash.new
end
|
#dependents_for(registration) ⇒ Object
55
56
57
|
# File 'lib/glimmer/data_binding/observer.rb', line 55
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# File 'lib/glimmer/data_binding/observer.rb', line 61
def register(observable, property = nil)
unless observable.is_a?(Observable)
if observable.is_a?(Array)
observable.extend(ObservableArray)
else
observable.extend(ObservableModel)
end
end
observable.add_observer(*[self, property].compact)
registration_for(observable, property).tap do |registration|
self.registrations << registration
end
end
|
#registration_for(observable, property = nil) ⇒ Object
45
46
47
|
# File 'lib/glimmer/data_binding/observer.rb', line 45
def registration_for(observable, property = nil)
Registration.new(observer: self, observable: observable, property: property)
end
|
#registrations ⇒ Object
41
42
43
|
# File 'lib/glimmer/data_binding/observer.rb', line 41
def registrations
@registrations ||= Set.new
end
|
#remove_dependent(parent_to_dependent_hash) ⇒ Object
113
114
115
116
117
|
# File 'lib/glimmer/data_binding/observer.rb', line 113
def remove_dependent(parent_to_dependent_hash)
registration = parent_to_dependent_hash.keys.first
dependent = parent_to_dependent_hash.values.first
dependents_for(registration).delete(dependent)
end
|
#unregister(observable, property = nil) ⇒ Object
Also known as:
unobserve
77
78
79
80
81
82
83
84
85
86
|
# File 'lib/glimmer/data_binding/observer.rb', line 77
def unregister(observable, property = nil)
observable.remove_observer(*[self, property].compact)
registration = registration_for(observable, property)
dependents_for(registration).each do |dependent|
dependent.unregister
remove_dependent(registration => dependent)
end
registrations.delete(registration)
end
|
#unregister_all_observables ⇒ Object
Also known as:
unobserve_all_observables
cleans up all registrations in observables
99
100
101
102
103
|
# File 'lib/glimmer/data_binding/observer.rb', line 99
def unregister_all_observables
registrations.each do |registration|
registration.unregister
end
end
|
#unregister_dependents_with_observable(registration, dependent_observable) ⇒ Object
89
90
91
92
93
94
95
96
|
# File 'lib/glimmer/data_binding/observer.rb', line 89
def unregister_dependents_with_observable(registration, dependent_observable)
thedependents = dependents_for(registration).select do |thedependent|
thedependent.observable == dependent_observable
end
thedependents.each do |thedependent|
thedependent.unregister
end
end
|