Advertisement
Guest User

Untitled

a guest
May 29th, 2015
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. module Contract
  2. module Contracts
  3. def push &contract
  4. stack.push contract
  5. end
  6.  
  7. def stack
  8. @stack || @stack = []
  9. end
  10.  
  11. private :stack
  12. end
  13.  
  14. class ContractRequires
  15. include Contracts
  16.  
  17. def assert *args
  18. stack.each {|r| r.call(*args)}
  19. end
  20. end
  21.  
  22. class ContractEnsures
  23. include Contracts
  24.  
  25. def assert arg
  26. stack.each {|e| e.call(arg)}
  27. end
  28. end
  29.  
  30. class ContractedMethod
  31. def initialize &contracts
  32. self.instance_eval &contracts
  33. end
  34.  
  35. def evaluation *args
  36. contract_requires.assert *args
  37. ret = @body.call *args
  38. contract_ensures.assert ret
  39. end
  40.  
  41. def requires &contract
  42. contract_requires.push &contract
  43. end
  44.  
  45. def ensures &contract
  46. contract_ensures.push &contract
  47. end
  48.  
  49. def body &method_body
  50. @body = method_body
  51. end
  52.  
  53. def contract_requires
  54. @contract_requires || @contract_requires = ContractRequires.new
  55. end
  56.  
  57. def contract_ensures
  58. @contract_ensures || @contract_ensures = ContractEnsures.new
  59. end
  60.  
  61. protected :requires, :ensures, :body, :contract_requires, :contract_ensures
  62. end
  63. end
  64.  
  65. m = Contract::ContractedMethod.new do
  66. requires do |arg1, arg2|
  67. puts "requires"
  68. p arg1
  69. p arg2
  70. end
  71. ensures do |ret|
  72. puts "ensures"
  73. p ret
  74. end
  75. body do |arg1, arg2|
  76. puts "body"
  77. p arg1
  78. p arg2
  79. "result"
  80. end
  81. end
  82.  
  83. m.evaluation("first arg", "second arg")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement