     }
 
     func then<ReturnType>(returnValue: ReturnType) -> MockFunctionWithoutDefaultReturn<T, ReturnType> {
-        return MockFunctionWithoutDefaultReturn<T, ReturnType>(binding: self, returnValue: returnValue)
+        return MockFunctionWithoutDefaultReturn<T, ReturnType>(bindings: [self: returnValue])
     }
 
     func then<ReturnType: Hashable>(returnValue: ReturnType) -> MockFunction<T, ReturnType> {
-        return MockFunction<T, ReturnType>(binding: self, returnValue: returnValue)
+        return MockFunction<T, ReturnType>(bindings: [self: returnValue])
     }
 }
 


extension String: DefaultConstructable {}

class MockFunctionWithBoundDefaultReturn<T: Hashable, ReturnType> {
    typealias Signature = (T) -> ReturnType
    typealias TBinding = Binding<T>

    var bindings: [TBinding: ReturnType] = [:]
    var invocationCount = 0
    let defaultReturn: ReturnType

    init(bindings: [TBinding : ReturnType], defaultReturn: ReturnType) {
        self.bindings = bindings
        self.defaultReturn = defaultReturn
    }

    func unbox() -> Signature {

}

class MockFunction<T: Hashable, ReturnType: DefaultConstructable>: MockFunctionWithBoundDefaultReturn<T, ReturnType> {
    init(bindings: Bindings) {
        super.init(bindings: bindings, defaultReturn: ReturnType())
    }
}

class MockFunctionWithoutDefaultReturn<T: Hashable, ReturnType>: _MockFunction<T, ReturnType> {
    override init(bindings: Bindings) { // FIXME: why is this needed?
        super.init(bindings: bindings)
    }

    func orElse(defaultReturn: ReturnType) -> MockFunctionWithBoundDefaultReturn<T, ReturnType> {
