Module: Glimmer::DataBinding::Observer

Included in:
ModelBinding, Glimmer::DataBinding::ObservableModel::Notifier, Proc
Defined in:
lib/glimmer/data_binding/observer.rb

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

Raises:



119
120
121
# File 'lib/glimmer/data_binding/observer.rb', line 119

def call(new_value)
  raise Error, 'Not implemented!'
end

#dependentsObject

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)
    # TODO refactor code to be more smart/polymorphic/automated and honor open/closed principle
    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

#registrationsObject



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)
  # TODO optimize performance in the future via indexing and/or making a registration official object/class
  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_observablesObject 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