Sha256: 46cd5231e4348706c50b9d06af7d0895e1e1001836e304681ca2d8e60d8cb361

Contents?: true

Size: 1.19 KB

Versions: 125

Compression:

Stored size: 1.19 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[#{self.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

125 entries across 125 versions & 1 rubygems

Version Path
trusty-cms-4.1.2 lib/method_observer.rb
trusty-cms-4.1.1 lib/method_observer.rb
trusty-cms-4.1.0 lib/method_observer.rb
trusty-cms-4.0.2 lib/method_observer.rb
trusty-cms-3.9.7 lib/method_observer.rb
trusty-cms-3.9.6 lib/method_observer.rb
trusty-cms-3.9.5 lib/method_observer.rb
trusty-cms-4.0.1 lib/method_observer.rb
trusty-cms-3.9.4 lib/method_observer.rb
trusty-cms-3.9.3 lib/method_observer.rb
trusty-cms-3.9.2 lib/method_observer.rb
trusty-cms-4.0.0 lib/method_observer.rb
trusty-cms-3.9.1 lib/method_observer.rb
trusty-cms-3.9.0 lib/method_observer.rb
trusty-cms-3.8.4 lib/method_observer.rb
trusty-cms-3.8.3 lib/method_observer.rb
trusty-cms-3.8.2 lib/method_observer.rb
trusty-cms-3.8.1 lib/method_observer.rb
trusty-cms-3.8.0 lib/method_observer.rb
trusty-cms-3.7.1 lib/method_observer.rb