module Quacks::Quackable

Public: Concern to be extended in order to enable the quacks like method.

Public Instance Methods

quacks_like(method_name, *signature_args) click to toggle source

Public: Force the given method to use the given conversions for its arguments.

Examples

class Calculator
  def add(int_a, int_b)
    int_a + int_b
  end
  quacks_like :add, :to_i, :to_i
end

# Supported arguments will be converted accordingly.
Calculator.new.add(1, '2')
#=> 3

# Unspported arguments will raise an error
Calculator.new.add(1, {})
#=> SignatureError: Expected `{}` to respond to `to_i`.

# To add signatures to class methods you can use the singleton class.
class Calculator
  singleton_class.extend(Quacks::Quackable)

  def self.add(int_a, int_b)
    int_a + int_b
  end
  singleton_class.quacks_like :add, :to_i, :to_i
end

Returns the Symbol method name.

# File lib/quacks/quackable.rb, line 33
def quacks_like(method_name, *signature_args)
  alias_method "orig_#{method_name}", method_name
  define_method(method_name) do |*args|
    signature = Quacks::Signature.new(*signature_args)
    send("orig_#{method_name}", *signature.apply!(*args))
  end
end