Skip to content

Instantly share code, notes, and snippets.

@duckinator
Created May 25, 2016 23:27
Show Gist options
  • Save duckinator/9088bd45573dcc39b0919e00293cb2e1 to your computer and use it in GitHub Desktop.
Save duckinator/9088bd45573dcc39b0919e00293cb2e1 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'spinny/utilities'
=begin
def foo
def foo
1
end
p foo
2
end
p foo
=end
=begin
def add(num, num)
num + num
end
safe :add,
takes: [Integer, Integer],
returns: Integer
=end
class Symbol
def accepts(*accepted)
_method = Spinny::Utilities.caller_method(self)
calling_object.instance_exec(self, _method, accepted) do |method_name, _method, accepted|
send(:define_method, method_name) do |*args|
args.each_with_index do |arg, idx|
expected = accepted[idx]
actual = arg.class
next if arg.is_a?(expected)
raise "Expected `#{arg.inspect}' to be #{expected}, got #{actual}"
end
_method.call(*args)
end
end
self
end
# TODO: Handle more complex return types.
def returns(*args)
_method = Spinny::Utilities.caller_method(self)
p Spinny::Utilities.caller_binding.receiver
p calling_object
return self
calling_object.instance_exec(self, _method, accepted) do |method_name, _method, accepted|
send(:define_method, method_name) do |*args|
expected = accepted
ret = _method.call(*args)
raise "Expected `#{arg.inspect}' to be #{expected}, got #{actual}"
ret
end
end
self
end
private
def calling_object
Spinny::Utilities.caller_binding(1).receiver
end
end
def add(num1, num2)
num1 + num2
end
.accepts(Numeric, Numeric)
.returns(Numeric)
p add(1, 2)
p add('a', 'b')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment