Sha256: d08bc867b95f9469081232c1f6536216b46f2728505ac59841f1a9569ad97832

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

# Copyright (C) 2007-2008 Annas Al Maleh
# Licensed under the LGPL. See /COPYING.LGPL for more details.

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 "def <<(value) \n self.original_add(value); notify_observers; \nend"
    
    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 "def #{method}(#{arguments}) \n self.original_#{method}(#{arguments}); notify_observers; \nend"
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
glimmer-0.1.0.0 src/command_handlers/models/observable_array.rb