         value = JSON.purify(raw: raw)
     }
     
-    subscript(key: String) -> JSONRepresentable {
+    public subscript(key: String) -> JSONRepresentable {
         get {
             if let value = self.value[key] {
                 return value

    case object(RawJSON)
    case list([RawJSON])
    
    func buildObject<T:JSONObject>() throws -> T {
        switch self {
        case .object(let rawJSON):
            return T(json:PureJSON(raw: rawJSON))
        default:
            throw JSONError.wrongBaseTypeForBuilding(expectedType: ".object")
        }
    }
    
    func buildList<T:JSONObject>() throws -> [T] {
        switch self {
        case .list(let list):
            let mappedList = list.map({ (rawJSON) -> T in
                return T(json:PureJSON(raw: rawJSON))
            })
            return mappedList
        default:
            throw JSONError.wrongBaseTypeForBuilding(expectedType: ".list")
        }
    }
    
    static func purify(raw:RawJSON) -> PureJSONValue {



public struct PureJSON {
    public let value:PureJSONValue
    
    init() {
        value = PureJSONValue()
