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