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