 }
 
 open class ConductionModel<Key: IncKVKeyType, State: ConductionModelState>: ConductionModelType {
+   // MARK: Private Properties
+   private var values: [Key : Any] = [:]
+   
    // MARK: Public Properties
-   public var modelBindings: [Binding]
-   public var state: State {
+   public var state: State = State() {
       didSet {
          onStateChange?(state)
       }

   open var viewReadKeys: [Key] { return viewReadOnlyKeys + viewReadWriteKeys }
   open var viewWriteKeys: [Key] { return viewReadWriteKeys + viewWriteOnlyKeys }
   
   public func bindings(for key: Key) -> [Binding] {
      let bindings = modelBindings.filter(key: key)
      guard bindings.isEmpty else { return bindings }
      return [Binding(key: key, target: self, targetKey: key)]
   }
   
   public func bindings<MapKey: IncKVKeyType>(for key: Key, mappedTo mapKey: MapKey) -> [Binding] {
      let bindings = modelBindings.filter(key: key)
      guard bindings.isEmpty else { return bindings.map(firstKey: key, toSecondKey: mapKey) }
      return [Binding(key: mapKey, target: self, targetKey: key)]
   }
   
   // MARK: - Bindable Protocol
   public var bindingBlocks: [Key : [((targetObject: AnyObject, rawTargetKey: String)?, Any?) throws -> Bool?]] = [:]
   public var keysBeingSet: [Key] = []
   
   public func value(for key: Key) -> Any? {
      guard modelReadKeys.contains(key) else { return conductedValue(for: key) }
      let bindings = modelBindings.filter(key: key)
      return bindings.last?.targetValue
   }
   
   public func setOwn(value: Any?, for key: Key) throws {
      guard modelWriteKeys.contains(key) else { try set(conductedValue: value, for: key); return }
      let bindings = modelBindings.filter(key: key)
      try bindings.forEach { try $0.set(targetValue: value) }
   }
}

   var modelWriteKeyStrings: [String] { get }
   var viewReadKeyStrings: [String] { get }
   var viewWriteKeyStrings: [String] { get }
}

public extension StringConductionModelType {
