module CallBaecker::ClassMethods

Public Instance Methods

method_added(name) click to toggle source
# File lib/CallBaecker.rb, line 9
def method_added(name)
  return if @__last_methods_added && @__last_methods_added.include?(name)
  
  # setup
  # TODO make it pluggable
  # it shouldnt be limited to rubisierung
  has_before_hook = instance_variables.include? :@__setup_instance_method
  if has_before_hook
    params = @__setup_instance_method.call(self, name)
  end
  
  with = :"#{name}_with_before_each_method"
  without = :"#{name}_without_before_each_method"
  @__last_methods_added = [name, with, without]
  _self = self
  define_method with do |*args, &block|
    callee = caller.first
    @__last_args = *args
    catch :CallBaeckerDone do
      # before hook
      # TODO make it pluggable
      # it shouldnt be limited to rubisierung
      if has_before_hook
        *args = _self.instance_variable_get(:@__before_hook).call(params, args[0], callee, self, name)
      end
      value = send without, *args, &block
      data = {}
      data[:value] = value
      if has_before_hook
        data = _self.instance_variable_get(:@__after_hook).call(data)
      end
      data[:value]
    end
  end
  # teardow
  alias_method without, name
  alias_method name, with
  @__last_methods_added = nil
end
singleton_method_added(name) click to toggle source
# File lib/CallBaecker.rb, line 50
def singleton_method_added(name)
  return if @__last_methods_added && @__last_methods_added.include?(name)

  # setup
  # TODO make it pluggable
  # it shouldnt be limited to rubisierung
  has_before_hook = instance_variables.include? :@__setup_class_method
  if has_before_hook
    params = @__setup_class_method.call(self, name)
  end
  
  with = :"#{name}_with_before_each_method"
  without = :"#{name}_without_before_each_method"
  @__last_methods_added = [name, with, without]
  define_singleton_method with do |*args, &block|
    @__last_args = *args
    callee = caller.first
    catch :CallBaeckerDone do
      # before hook
      # TODO make it pluggable
      # it shouldnt be limited to rubisierung
      if has_before_hook  
        *args = @__before_hook.call(params, args[0], callee, self, name)
      end
      value = send without, *args, &block
      data = {}
      data[:value] = value
      if has_before_hook
        data = @__after_hook.call(data)
      end
      data[:value]
    end
  end
  # TODO teardown
  singleton_class.send(:alias_method, without, name.to_sym)
  singleton_class.send(:alias_method, name.to_sym, with)
  @__last_methods_added = nil
end