     // MARK: - Unboxing required values (by key)
     
     /// Unbox a required value by key
-    public func unbox<T: UnboxCompatibleType>(key: String) throws -> T {
+    public func unbox<T: UnboxCompatible>(key: String) throws -> T {
         return try self.unbox(path: .key(key), transform: T.unbox)
     }
     


// MARK: - Private extensions

private extension UnboxCompatibleType {
    static func unbox(value: Any) throws -> Self? {
        return try self.unbox(value: value, allowInvalidCollectionElements: false)
    }
}

private extension UnboxCompatibleType where Self: Collection {
    static func makeTransform(allowInvalidElements: Bool) -> UnboxTransform<Self> {
        return {
            try self.unbox(value: $0, allowInvalidCollectionElements: allowInvalidElements)

}

/// Protocol used to enable collections to be unboxed. Default implementations exist for Array & Dictionary
public protocol UnboxableCollection: Collection, UnboxCompatible {
    /// The raw collection type that this type can be unboxed from
    associatedtype UnboxRawCollection: Collection
    /// The value type that this collection contains
