lib/rubype.rb in rubype-0.2.0 vs lib/rubype.rb in rubype-0.2.1
- old
+ new
@@ -1,7 +1,5 @@
-require "rubype/rubype"
-
# Builtin Contracts
class Any; end
module Boolean; end
TrueClass.send(:include, Boolean)
FalseClass.send(:include, Boolean)
@@ -11,39 +9,51 @@
def __rubype__
prepend (@__rubype__ = Module.new) unless @__rubype__
@__rubype__
end
+ # @param hash [Hash] {method_name: [ArgClass1, ArgClass2, ... ArgClassn => RtnClass]}
def typesig(hash)
meth = hash.keys.first
*arg_types, type_pair = hash.values.first
__rubype__.send(:define_method, meth) do |*args, &block|
- ::Rubype.assert_arg_type(meth, args, arg_types << type_pair.keys.first)
+ ::Rubype.send(:assert_arg_type, meth, args, arg_types << type_pair.keys.first)
rtn = super(*args, &block)
- ::Rubype.assert_trn_type(meth, rtn, type_pair.values.first)
+ ::Rubype.send(:assert_trn_type, meth, rtn, type_pair.values.first)
rtn
end
self
end
end
module Rubype
class << self
+ private
+
+ # @param meth [Symbol]
+ # @param args [Array<Object>]
+ # @param klasses [Array<Class>]
def assert_arg_type(meth, args, klasses)
args.each_with_index do |arg, i|
if wrong_type?(arg, klasses[i])
raise ArgumentError, "Wrong type of argument, type of #{arg.inspect} should be #{klasses[i]}"
end
end
end
+ # @param meth [Symbol]
+ # @param rtn [Object]
+ # @param klass [Class]
def assert_trn_type(meth, rtn, klass)
if wrong_type?(rtn, klass)
raise TypeError, "Expected #{meth} to return #{klass} but got #{rtn.inspect} instead"
end
end
+ # @param obj [Object]
+ # @param klass [Class]
+ # @return [Boolean]
def wrong_type?(obj, klass)
!(obj.is_a?(klass) || klass == Any)
end
end
end