lib/qrb/syntax/contract.rb in qrb-0.2.0 vs lib/qrb/syntax/contract.rb in qrb-0.3.0
- old
+ new
@@ -1,24 +1,36 @@
module Qrb
module Syntax
module Contract
def compile(factory, clazz)
- contract = [
- type.compile(factory),
- compile_upper(factory, clazz)
- ]
+ contract = [ type.compile(factory) ] + compile_pair(factory, clazz)
{ contract_name.to_sym => contract }
end
- def compile_upper(factory, clazz)
- if up
- up.compile(factory)
+ def compile_pair(factory, clazz)
+ if pair
+ pair.compile(factory)
elsif clazz
- clazz.method(contract_name.to_sym)
+ dresser = clazz.method(contract_name.to_sym)
+ undresser = clazz.instance_method(:"to_#{contract_name}")
+ [
+ dresser,
+ ->(d){ undresser.bind(d).call }
+ ]
else
- Qrb::IDENTITY
+ [ Qrb::IDENTITY, Qrb::IDENTITY ]
end
+ end
+
+ def to_ast
+ ast = [
+ :contract,
+ contract_name.to_s,
+ (type && type.to_ast)
+ ]
+ ast << pair.to_ast if pair
+ ast
end
end # module Contract
end # module Syntax
end # module Qrb