Module: ObservableArray

Includes:
Observable
Defined in:
lib/command_handlers/models/observable_array.rb

Overview

TODO prefix utility methods with double-underscore

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extend_object(array) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/command_handlers/models/observable_array.rb', line 43

def self.extend_object(array)
  array.instance_eval("alias __original_add <<")
  array.instance_eval <<-end_eval, __FILE__, __LINE__
    def <<(value)
      self.__original_add(value)
      notify_observers
    end
  end_eval

  array.instance_eval("alias __original_set_value []=")
  array.instance_eval <<-end_eval, __FILE__, __LINE__
    def []=(index, value)
      old_value = self[index]
      unregister_dependent_observers(old_value)
      self.__original_set_value(index, value)
      notify_observers
    end
  end_eval

  array.instance_eval("alias __original_delete delete")
  array.instance_eval <<-end_eval, __FILE__, __LINE__
    def delete(value)
      unregister_dependent_observers(value)
      self.__original_delete(value)
      notify_observers
    end
  end_eval

  array.instance_eval("alias __original_delete_at delete_at")
  array.instance_eval <<-end_eval, __FILE__, __LINE__
    def delete_at(index)
      old_value = self[index]
      unregister_dependent_observers(old_value)
      self.__original_delete_at(index)
      notify_observers
    end
  end_eval

  array.instance_eval("alias __original_clear clear")
  array.instance_eval <<-end_eval, __FILE__, __LINE__
    def clear
      each do |old_value|
        unregister_dependent_observers(old_value)
      end
      self.__original_clear
      notify_observers
    end
  end_eval

  super
end

Instance Method Details

#add_observer(observer, element_properties = nil) ⇒ Object



9
10
11
12
13
14
15
16
17
18
# File 'lib/command_handlers/models/observable_array.rb', line 9

def add_observer(observer, element_properties=nil)
  property_observer_list << observer
  [element_properties].flatten.compact.each do |property|
    each do |element|
      element.extend(ObservableModel) unless element.is_a?(ObservableModel)
      observer.observe(element, property)
    end
  end
  observer
end

#has_observer?(observer) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/command_handlers/models/observable_array.rb', line 31

def has_observer?(observer)
  property_observer_list.include?(observer)
end

#notify_observersObject



39
40
41
# File 'lib/command_handlers/models/observable_array.rb', line 39

def notify_observers
  property_observer_list.each {|observer| observer.update}
end

#property_observer_listObject



35
36
37
# File 'lib/command_handlers/models/observable_array.rb', line 35

def property_observer_list
  @property_observer_list ||= Set.new
end

#remove_observer(observer, element_properties = nil) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/command_handlers/models/observable_array.rb', line 20

def remove_observer(observer, element_properties=nil)
  property_observer_list.delete(observer)
  [element_properties].flatten.compact.each do |property|
    each do |element|
      element.extend(ObservableModel) unless element.is_a?(ObservableModel)
      observer.unobserve(element, property)
    end
  end
  observer
end

#unregister_dependent_observers(old_value) ⇒ Object



95
96
97
98
99
100
101
# File 'lib/command_handlers/models/observable_array.rb', line 95

def unregister_dependent_observers(old_value)
  # TODO look into optimizing this
  return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
  property_observer_list.each do |observer|
    observer.unregister_dependents_with_observable([self, nil], old_value)
  end
end