class MethodObserver

Constants

VERSION

Public Class Methods

after(&block) click to toggle source
# File lib/method_observer.rb, line 17
def after(&block)
  @after = block
end
around(&block) click to toggle source
# File lib/method_observer.rb, line 21
def around(&block)
  @around = block
end
before(&block) click to toggle source
# File lib/method_observer.rb, line 13
def before(&block)
  @before = block
end
observe(klass, options) click to toggle source
# File lib/method_observer.rb, line 25
def observe(klass, options)
  options.fetch(:instance, []).each do |method|
    observe_instance_method klass, method
  end

  options.fetch(:class, []).each do |method|
    observe_class_method klass, method
  end
end

Private Class Methods

observe_class_method(klass, method) click to toggle source
# File lib/method_observer.rb, line 55
def observe_class_method(klass, method)
  observe_before = @before
  observe_after  = @after
  observe_around = @around

  observed_method = "__#{method}_observed__"
  klass.singleton_class.send :alias_method, observed_method, method
  
  klass.send(:define_singleton_method, method) do |*args, &block|
    observe_before.call klass, :class, method, args
    result = observe_around.call klass, :class, method, args do
      send observed_method, *args, &block
    end
    observe_after.call klass, :class, method, args
    result
  end
end
observe_instance_method(klass, method) click to toggle source
# File lib/method_observer.rb, line 37
def observe_instance_method(klass, method)
  observe_before = @before
  observe_after  = @after
  observe_around = @around

  observed_method = "__#{method}_observed__"
  klass.send :alias_method, observed_method, method
  
  klass.send(:define_method, method) do |*args, &block|
    observe_before.call klass, :instance, method, args
    result = observe_around.call klass, :instance, method, args do
      send observed_method, *args, &block
    end
    observe_after.call klass, :instance, method, args
    result
  end
end