class EnumerableObserver::Observer
Constants
- SAFE_METHODS
- UNSAFE_METHODS
Public Class Methods
new(obj)
click to toggle source
# File lib/enumerable_observer.rb, line 34 def initialize(obj) @object = obj observers_proc = observer_method_proc(obj.respond_to?(:observers) ? obj.observers : []) obj.define_singleton_method(:observers, &observers_proc) obj.extend mod end
Public Instance Methods
added(&block)
click to toggle source
# File lib/enumerable_observer.rb, line 73 def added(&block) blocks[:add] = block self end
mod()
click to toggle source
# File lib/enumerable_observer.rb, line 42 def mod @mod ||= begin obj = @object blocks = self.blocks Module.new do (obj.methods - SAFE_METHODS).each do |meth| old = obj.method(meth).unbind.bind(obj) define_method(meth) do |*args, &block| before = each.to_a val = old.call(*args, &block) after = each.to_a added = after - before removed = before - after blocks[:add].unstrict.call(added) unless added.empty? || !blocks[:add] blocks[:remove].unstrict.call(removed) unless removed.empty? || !blocks[:remove] val end end end end end
removed(&block)
click to toggle source
# File lib/enumerable_observer.rb, line 78 def removed(&block) blocks[:remove] = block self end
unobserve()
click to toggle source
# File lib/enumerable_observer.rb, line 64 def unobserve mod.instance_methods.each do |method_name| mod.module_eval do remove_method method_name end end @unobserved = true end
Protected Instance Methods
blocks()
click to toggle source
# File lib/enumerable_observer.rb, line 85 def blocks @blocks ||= {} end
Private Instance Methods
observer_method_proc(existing = [])
click to toggle source
# File lib/enumerable_observer.rb, line 27 def observer_method_proc(existing = []) array = [self, *existing].freeze lambda do array end end