     /// - throws: One of the `JSON.Error` cases thrown by `decode(_:or:)`.
     /// - seealso: `JSON.decode(_:or:)`
     public func dictionary(path: PathFragment..., @autoclosure or fallback: () -> [Swift.String: JSON]) throws -> [Swift.String: JSON] {
-        let dictionary = try optionalAtPath(path, ifNotFound: true) { try $0.dictionary() }
-        return dictionary ?? fallback()
+        return try mapOptionalAtPath(path, fallback: fallback) { try $0.dictionary() }
     }
 
 }

    /// - throws: One of the `JSON.Error` cases thrown by `decode(_:or:)`.
    /// - seealso: `JSON.decode(_:or:)`
    public func array(path: PathFragment..., @autoclosure or fallback: () -> [JSON]) throws -> [JSON] {
        let array = try optionalAtPath(path, ifNotFound: true) { try $0.array() }
        return array ?? fallback()
    }

    /// Attempts to decodes many values from a desendant JSON array at a path

        return try optionalAtPath(path, ifNotFound: ifNotFound) { try $0.dictionary() }
    }

}

// MARK: - Missing-with-fallback unpacking

extension JSON {

    private func mapOptionalAtPath<Value>(path: [PathFragment], @noescape fallback: () -> Value, @noescape transform: JSON throws -> Value) throws -> Value {
        return try mapOptionalAtPath(path, ifNotFound: true, transform: transform) ?? fallback()
    }

    /// Attempts to decode into the returning type from a path into
