     arr: arr
     ___: ___
     any: any
-    or: or_
+    'or': or_
     none: none
-    not: not_
-    and: and_
+    'not': not_
+    'and': and_
     opt: opt
     guard: guard
 
   contracts =
-    Undefined: combinators.check((x) ->
-      `undefined` is x
-    , "Undefined")
-    Null: combinators.check((x) ->
+    Undefined: combinators.check (x) ->
+      undefined is x
+    , "Undefined"
+
+    Null: combinators.check (x) ->
       null is x
-    , "Null")
-    Num: combinators.check((x) ->
+    , "Null"
+
+    Num: combinators.check (x) ->
       typeof (x) is "number"
-    , "Num")
-    Bool: combinators.check((x) ->
+    , "Num"
+
+    Bool: combinators.check (x) ->
       typeof (x) is "boolean"
-    , "Bool")
-    Str: combinators.check((x) ->
+    , "Bool"
+
+    Str: combinators.check (x) ->
       typeof (x) is "string"
-    , "Str")
-    Odd: combinators.check((x) ->
+    , "Str"
+
+    Odd: combinators.check (x) ->
       (x % 2) is 1
-    , "Odd")
-    Even: combinators.check((x) ->
+    , "Odd"
+
+    Even: combinators.check (x) ->
       (x % 2) isnt 1
-    , "Even")
-    Pos: combinators.check((x) ->
+    , "Even"
+
+    Pos: combinators.check (x) ->
       x >= 0
-    , "Pos")
-    Nat: combinators.check((x) ->
+    , "Pos"
+
+    Nat: combinators.check (x) ->
       x > 0
-    , "Nat")
-    Neg: combinators.check((x) ->
+    , "Nat"
+
+    Neg: combinators.check (x) ->
       x < 0
-    , "Neg")
-    Arr: combinators.object(length: combinators.check((x) ->
+    , "Neg"
+
+    Arr: combinators.object(length: combinators.check (x) ->
       typeof (x) is "number"
-    , "Number"))
+    , "Number")
+    
     Self: self
     Any: any
     None: none

          obj[name]

      handler.set = (receiver, name, val) ->
        invariant = undefined
        blame neg, pos, "non-extensible object", "[attempted to set a new property: " + name + "]", parents  if (options.extensible is false) and Object.getOwnPropertyDescriptor(obj, name) is `undefined`
        blame neg, pos, "frozen object", "[attempted to set: " + name + "]", parents  if options.frozen
        if that.oc.hasOwnProperty(name)
          blame neg, pos, "read-only property", "[attempted to set read-only property: " + name + "]", parents  unless that.oc[name].writable
          obj[name] = that.oc[name]["value"].check(val, neg, pos, parents)
        else if (options.arrayRangeContract and (options.arrayRange isnt `undefined`)) and (parseInt(name, 10) >= options.arrayRange)
          obj[name] = options.arrayRangeContract.check(val, neg, pos, parents)
        else
          obj[name] = val
        if options.invariant
          invariant = options.invariant.bind(obj)
          blame neg, pos, "invariant: " + options.invariant.toString(), obj, parents  unless invariant()
        true

      if typeof obj is "function"
        op = Proxy.createFunction(handler, (args) ->
          obj.apply this, arguments
        , (args) ->
          boundArgs = undefined
          bf = undefined
          boundArgs = [].concat.apply([ null ], arguments)
          bf = obj.bind.apply(obj, boundArgs)
          new bf()

      arrayRange: rangeIndex
      arrayRangeContract: rangeContract
    , name

  ___ = (k) -> (-> k)

  or_ = ->
    ks = [].slice.call(arguments)

    flats = ks.filter (el) -> el.ctype is "check"
    ho = ks.filter (el) -> el.ctype isnt "check"
    throw "Cannot have more than 1 higher order contract in 'or'"  if ho.length > 1

    name = ks.join(" or ")
    c = new Contract(name, "or", (val, pos, neg, parentKs) ->
      parents = parentKs.slice(0)
      parents.push this

      i = 0
      while i < flats.length
        try
