 
     private mutating func unbox<T: Decodable>() throws -> T {
         try throwErrorIfAtEnd(T.self)
-        let decoded: T = try currentDecoder.cast(currentObject)
+        let decoded: T = try currentDecoder.unbox(currentObject)
         currentIndex += 1
         return decoded
     }

    }

    private func unbox<T: Decodable>(for key: Key) throws -> T {
        return try decoder(for: key).cast(object(for: key))
    }
}



    // MARK: -

    fileprivate func unbox<T: Decodable>(_ object: Any) throws -> T {
        if let strategy = options.decodingStrategies[T.self] {
            return try strategy.closure(self)
        } else {
            return try cast(object)
        }
    }

    private func cast<T>(_ object: Any) throws -> T {
        guard let value = object as? T else {
            throw _typeMismatch(at: codingPath, expectation: T.self, reality: object)
        }
        return value
    }

    /// create a new `_Decoder` instance referencing `object` as `key` inheriting `userInfo`
