Sha256: fda594aae49eff99d08f0b3e08cc81834334c88737f486d0ddeb0e4fd8048a4e

Contents?: true

Size: 1.43 KB

Versions: 6

Compression:

Stored size: 1.43 KB

Contents

module ObservableArray
  
  def add_observer(element_properties, observer)
    property_observer_list << observer
    each do |element|
      element_properties.each do |property|
        element.extend(ObservableModel) unless element.is_a?(ObservableModel)
        element.add_observer(property, observer)
      end
    end
  end

  def property_observer_list
    @property_observer_list = [] unless @property_observer_list
    @property_observer_list
  end
  
  def notify_observers
    property_observer_list.each {|observer| observer.update}
  end
  
  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
    
    notify_observers_on_invokation(array, "delete", 1)
    notify_observers_on_invokation(array, "delete_at", 1)
    notify_observers_on_invokation(array, "clear")
    
    super
  end
  
  def self.notify_observers_on_invokation(model, method, argument_count=0)
    model.instance_eval "alias original_#{method} #{method}\n"
    arguments = ""
    for index in 1..argument_count
      arguments += "argument" + index.to_s + ","
    end
    arguments = arguments[0..-2]
    model.instance_eval <<-end_eval, __FILE__, __LINE__
      def #{method}(#{arguments})
        self.original_#{method}(#{arguments}) 
        notify_observers 
      end
    end_eval
  end

end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
glimmer-0.1.8.470 lib/command_handlers/models/observable_array.rb
glimmer-0.1.5.470 lib/command_handlers/models/observable_array.rb
glimmer-0.1.4.470 lib/command_handlers/models/observable_array.rb
glimmer-0.1.4.swt.pre.4.7.0 lib/command_handlers/models/observable_array.rb
glimmer-0.1.3 lib/command_handlers/models/observable_array.rb
glimmer-0.1.2 lib/command_handlers/models/observable_array.rb