 
 public extension JSONString {
     public init(json: JSON) throws {
-        guard let object = Self.init(rawValue: try String(json: json) ) else {
-            throw JSONModelError.invalidElement
-        }
+        guard let object = Self.init(rawValue: try String(json: json) ) else { throw JSONModelError.invalidElement }
         self = object
     }
     
-    public var jsonValue: JSON {
-        return rawValue.jsonValue
-    }
-}
-
-// MARK: - JSON Models
+    public var jsonValue: JSON { return rawValue.jsonValue }
+}
+
 public extension JSONObjectInitializable where PropertyKey.RawValue == String {
     init(json: JSON) throws {
-        let jsonObject = try JSONObject<PropertyKey>(json: json)
-        try self.init(object: jsonObject)
+        try self.init(object: try JSONObject(json: json))
     }
 }
 
 public extension JSONObjectRepresentable where PropertyKey.RawValue == String {
     var jsonValue: JSON {
-        return JSONObject<PropertyKey>(dictValue).jsonValue
+        return JSONObject(dictValue).jsonValue
     }
 }
 

    }
}

public protocol JSONString: RawRepresentable, JSONInitializable, JSONRepresentable {
    init?(rawValue: String)
    var rawValue: String { get }

    }
}

public extension JSON {
    public func value() throws -> Bool {
        guard let boolValue = bool else { throw JSONModelError.invalidElement }
