Sha256: 6e1401b7a42d4daa39c93f83a1c7f6a4871c734af4fe05a6b99b1e9c41fed65f

Contents?: true

Size: 1.16 KB

Versions: 81

Compression:

Stored size: 1.16 KB

Contents

class MethodObserver
  attr_reader :target
  attr_accessor :result

  class ObserverCannotObserveTwiceError < StandardError
    def initialize(message = 'observer cannot observe twice')
      super
    end
  end

  def observe(target)
    raise ObserverCannotObserveTwiceError if @target

    @target = target
    make_observable(target)
  end

  def self.instances
    @instances ||= {}
  end

  def self.new(*args)
    o = super
    instances[o.object_id] = o
    o
  end

  private

  def make_observable(target)
    methods_to_observe.each do |method|
      target.instance_eval %{
          def #{method}(*args, &block)
            observer = #{self.class}.instances[#{object_id}]
            observer.send(:before_#{method}, *args, &block) if observer.respond_to? :before_#{method}
            observer.result = super
            observer.send(:after_#{method}, *args, &block) if observer.respond_to? :after_#{method}
            observer.result
          end
        }
    end
  end

  def methods_to_observe
    (methods_for(:before) + methods_for(:after)).uniq
  end

  def methods_for(name)
    methods.grep(/^#{name}_/).map { |n| n.to_s.gsub(/^#{name}_/, '').intern }
  end
end

Version data entries

81 entries across 81 versions & 1 rubygems

Version Path
trusty-cms-7.0.9.1 lib/method_observer.rb
trusty-cms-7.0.11 lib/method_observer.rb
trusty-cms-7.0.10 lib/method_observer.rb
trusty-cms-7.0.9 lib/method_observer.rb
trusty-cms-7.0.8 lib/method_observer.rb
trusty-cms-7.0.7 lib/method_observer.rb
trusty-cms-7.0.6 lib/method_observer.rb
trusty-cms-7.0.5 lib/method_observer.rb
trusty-cms-7.0.4 lib/method_observer.rb
trusty-cms-7.0.3 lib/method_observer.rb
trusty-cms-6.3.1 lib/method_observer.rb
trusty-cms-7.0.2 lib/method_observer.rb
trusty-cms-7.0.1 lib/method_observer.rb
trusty-cms-7.0.0 lib/method_observer.rb
trusty-cms-6.3 lib/method_observer.rb
trusty-cms-6.2.1 lib/method_observer.rb
trusty-cms-6.2.2.1 lib/method_observer.rb
trusty-cms-6.2.0 lib/method_observer.rb
trusty-cms-6.1.2 lib/method_observer.rb
trusty-cms-6.1.1 lib/method_observer.rb