Module: ObservableModel

Defined in:
lib/command_handlers/models/observable_model.rb

Defined Under Namespace

Classes: Updater

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.add_method_observers(model, method) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/command_handlers/models/observable_model.rb', line 48

def self.add_method_observers(model, method)
  setter_method_pattern = /^(\w+=)$/
  if (method.match(setter_method_pattern))
    getter_method = method[0, method.length - 1]
    getter_value = model.send(getter_method)
    if (getter_value.is_a?(Array) and
        !getter_value.is_a?(ObservableArray))
      getter_value.extend(ObservableArray)
      getter_value.add_observer([], Updater.new(getter_method, model))
    end
    model.instance_eval "alias original_#{method} #{method}\n"
    model.instance_eval <<-end_eval, __FILE__, __LINE__
      def #{method}(value)
        self.original_#{method}(value)
        notify_observers('#{getter_method}')
        if (value.is_a?(Array) and !value.is_a?(ObservableArray))
          value.extend(ObservableArray)
          value.add_observer([], ObservableModel::Updater.new('#{getter_method}', self))
        end
      end
    end_eval
  end
end

.extend_object(model) ⇒ Object



41
42
43
44
45
46
# File 'lib/command_handlers/models/observable_model.rb', line 41

def self.extend_object(model)
  super
  model.methods.each do |method|
    self.add_method_observers(model, method)
  end
end

Instance Method Details

#add_observer(property_name, observer = nil, &updater) ⇒ Object

Takes observer as an object or a block updater



8
9
10
11
# File 'lib/command_handlers/models/observable_model.rb', line 8

def add_observer(property_name, observer = nil, &updater)
  observer ||= BlockObserver.new(&updater)
  property_observer_list(property_name) << observer
end

#has_observer?(property_name, observer) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
# File 'lib/command_handlers/models/observable_model.rb', line 13

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

#notify_observers(property_name) ⇒ Object



27
28
29
# File 'lib/command_handlers/models/observable_model.rb', line 27

def notify_observers(property_name)
  property_observer_list(property_name).each {|observer| observer.update(send(property_name))}
end

#property_observer_hashObject



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

def property_observer_hash
  @property_observers = Hash.new unless @property_observers
  @property_observers
end

#property_observer_list(property_name) ⇒ Object



22
23
24
25
# File 'lib/command_handlers/models/observable_model.rb', line 22

def property_observer_list(property_name)
  property_observer_hash[property_name.to_sym] = Set.new unless property_observer_hash[property_name.to_sym]
  property_observer_hash[property_name.to_sym]
end