class Adequack::Proxy

Attributes

interfaces[RW]
target[RW]

Public Class Methods

new(target, interfaces) click to toggle source
# File lib/adequack/proxy.rb, line 4
def initialize(target, interfaces)
  self.target = target
  self.interfaces = interfaces
end

Private Instance Methods

check_interface_implementation(name, args) click to toggle source
# File lib/adequack/proxy.rb, line 18
def check_interface_implementation(name, args)
  check_interface_signature(name, args) if method_in_interface?(name)
end
check_interface_signature(name, args) click to toggle source
# File lib/adequack/proxy.rb, line 22
def check_interface_signature(name, args)
  target_method = duck_type_methods.select { |m| m.name == name }.first
  req_m = target_method.parameters.select { |m| m.first == :req }

  if args.size < req_m.size
    raise InterfaceImplementationError,
      "definition of method '#{name}' differs in parameters accepted."
  end

  unless target_method.parameters.any? { |m| m.first == :rest }
    opt_m =
      target_method.parameters.select { |m| [:opt, :key].include? m.first }

    if args.size > (req_m.size + opt_m.size)
      raise InterfaceImplementationError,
        "definition of method '#{name}' differs in parameters accepted."
    end
  end
end
check_method_existence(method) click to toggle source
# File lib/adequack/proxy.rb, line 42
def check_method_existence(method)
  unless method_in_interface? method
    raise InterfaceImplementationError,
      "trying to stub nonexistent method"
  end
end
duck_type_methods() click to toggle source
# File lib/adequack/proxy.rb, line 53
def duck_type_methods
  @duck_type_methods ||= get_methods
end
get_methods() click to toggle source
# File lib/adequack/proxy.rb, line 57
def get_methods
  cm, im = [], []

  interfaces.each do |interface|
    cm += interface.methods.map { |m| interface.public_method(m) }
    im += interface.instance_methods.map { |m| interface.public_instance_method(m) }
  end

  cm + im
end
method_in_interface?(method) click to toggle source
# File lib/adequack/proxy.rb, line 49
def method_in_interface?(method)
  duck_type_methods.map(&:name).include? method.to_sym
end
method_missing(name, *args, &block) click to toggle source
# File lib/adequack/proxy.rb, line 13
def method_missing(name, *args, &block)
  check_interface_implementation name, args
  target.send name, *args, &block
end