       }
     }
 
-    return path(kinds)
+    return resolve(kinds)
+  }
+
+  private func extractKey(path: String) -> (key: String, keyPath: String) {
+    return (key: path.split(".").last!,
+            keyPath: Array(path.split(".").dropLast()).joinWithSeparator("."))
+  }
+
+  func path(path: [SubscriptKind]) -> JSONDictionary? {
+    return resolve(path)
+  }
+
+  func path(keyPath: String) -> JSONDictionary? {
+    return resolve(keyPath)
+  }
+
+  func path(keyPath: String) -> String? {
+    let (key, keyPath) = extractKey(keyPath)
+    let result: JSONDictionary? = resolve(keyPath)
+    return result?.property(key)
+  }
+
+  func path(keyPath: String) -> Int? {
+    let (key, keyPath) = extractKey(keyPath)
+    let result: JSONDictionary? = resolve(keyPath)
+    return result?.property(key)
+  }
+
+  func path(keyPath: String) -> JSONArray? {
+    let (key, keyPath) = extractKey(keyPath)
+    let result: JSONDictionary? = resolve(keyPath)
+    return result?.array(key)
   }
 }
 

}

public extension PathAccessible {
  func path(path: [SubscriptKind]) -> JSONDictionary? {
    var castedPath = path.dropFirst()
    castedPath.append(.Key(""))


      }
    }

    return result as? T
  }

  private func resolve<T>(path: String) -> T? {
    let kinds: [SubscriptKind] = path.componentsSeparatedByString(".").map {
      if let index = Int($0) {
        return .Index(index)
      } else {
