Method: Contract#initialize

Defined in:
lib/contracts.rb

#initialize(klass, method, *contracts) ⇒ Contract

Returns a new instance of Contract.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/contracts.rb', line 86

def initialize(klass, method, *contracts)
  unless contracts.last.is_a?(Hash)
    unless contracts.one?
      fail %{
        It looks like your contract for #{method.name} doesn't have a return
        value. A contract should be written as `Contract arg1, arg2 =>
        return_value`.
      }.strip
    end
    contracts = [nil => contracts[-1]]
  end

  # internally we just convert that return value syntax back to an array
  @args_contracts = contracts[0, contracts.size - 1] + contracts[-1].keys

  @ret_contract = contracts[-1].values[0]

  @args_validators = args_contracts.map do |contract|
    Contract.make_validator(contract)
  end

  @args_contract_index = args_contracts.index do |contract|
    contract.is_a? Contracts::Args
  end

  @ret_validator = Contract.make_validator(ret_contract)

  # == @has_proc_contract
  last_contract = args_contracts.last
  is_a_proc = last_contract.is_a?(Class) && (last_contract <= Proc || last_contract <= Method)
  maybe_a_proc = last_contract.is_a?(Contracts::Maybe) && last_contract.include_proc?

  @has_proc_contract = is_a_proc || maybe_a_proc || last_contract.is_a?(Contracts::Func)
  # ====

  # == @has_options_contract
  last_contract = args_contracts.last
  penultimate_contract = args_contracts[-2]
  @has_options_contract = if @has_proc_contract
                            penultimate_contract.is_a?(Hash)
                          else
                            last_contract.is_a?(Hash)
                          end
  # ===

  @klass, @method = klass, method
end