     /// - throws: One of the `JSON.Error` cases thrown by `decode(_:ifNull:type:)`,
     ///   or any error that arises from decoding the contained values.
     /// - seealso: `JSON.decode(_:ifNull:type:)`
-    public func arrayOf<Decoded: JSONDecodable>(path: JSONPathType..., ifNull: Swift.Bool) throws -> [Decoded]? {
-        return try arrayAtPath(path, ifNotFound: false, ifNull: ifNull)?.map { try $0.decode() }
+    public func arrayOf<Decoded: JSONDecodable>(first: PathFragment? = nil, _ rest: PathFragment..., ifNull: Swift.Bool) throws -> [Decoded]? {
+        let array = try optionalAtPath(first, rest, ifNotFound: false, ifNull: ifNull) { try $0.array() }
+        return try array?.map(Decoded.init)
     }
 
     /// Optionally retrieves a `[String: JSON]` from a path into the recieving

    ///     corresponding `JSON` value.
    ///   * `TypeNotConvertible`: The target value's type inside of
    ///     the `JSON` instance does not match `Decoded`.
    public func decode<Decoded: JSONDecodable>(path: JSONPathType..., @autoclosure or fallback: () -> Decoded) throws -> Decoded {
        return try decodedAtPath(path, or: fallback)
    }

    /// Retrieves a `Double` from a path into JSON or a fallback if not found.

    /// - returns: A truthy `Bool` if a value could be found, otherwise `nil`.
    /// - throws: One of the `JSON.Error` cases thrown by `decode(_:ifNotFound:type:)`.
    /// - seealso: `JSON.decode(_:ifNotFound:type:)`
    public func bool(first: PathFragment, _ rest: PathFragment..., ifNotFound: Swift.Bool) throws -> Swift.Bool? {
        return try decodedAtPath(first, rest, ifNotFound: true, ifNull: false)
    }

    /// Optionally decodes into the returning type from a path into JSON.
