class Quacky::DuckTypeVerifier
Attributes
duck_type[R]
Public Class Methods
new(duck_type)
click to toggle source
# File lib/quacky/duck_type_verifier.rb, line 5 def initialize duck_type @duck_type = duck_type end
Public Instance Methods
verify!(object)
click to toggle source
# File lib/quacky/duck_type_verifier.rb, line 9 def verify! object duck_type_methods.each do |method| raise Quacky::DuckTypeVerificationFailure, "object does not respond to `#{method.name}'" unless object.respond_to?(method.name) begin target_method = object.public_method(method.name) return true if target_method.parameters.any? { |p| p.first == :rest } method_parameters = method.parameters.reject { |p| p.first == :block } target_method_parameters = target_method.parameters.reject { |p| p.first == :block } if target_method_parameters.count != method_parameters.count || target_method_parameters.map {|p| p.first } != method_parameters.map {|p| p.first} raise Quacky::DuckTypeVerificationFailure, "definitions of method `#{method.name}` differ in parameters accepted." end rescue NameError; end true end end
Private Instance Methods
duck_type_methods()
click to toggle source
# File lib/quacky/duck_type_verifier.rb, line 33 def duck_type_methods @duck_type_methods ||= (duck_type_object.methods - Object.methods).map do |method_name| @duck_type_object.public_method(method_name) end end
duck_type_object()
click to toggle source
# File lib/quacky/duck_type_verifier.rb, line 39 def duck_type_object return @duck_type_object if @duck_type_object duck_type_class = Class.new duck_type_class.send :include, duck_type @duck_type_object = duck_type_class.new end