         - name: The name under which to register the block.
         - container: The container in which to register the block.
     */
-    public static func register<T, N: Hashable, C: Hashable>(instance: T, name: N, container: C, metadata: Metadata = [:]) -> Key {
+    public static func register<T, N: Hashable, C: Hashable>(instance: T, name: N, container: C, metadata: Any = ()) -> Key {
         return register(key: Key(type: T.self, name: Name.default, container: Name.default), metadata: metadata, cached: true) { instance }
     }
     

     Because all of type, name, and container are specified, this particular method will return either 
     an empty array or an array with a single value.
    */
    public static func filter<T, N: Hashable, C: Hashable>(type: T.Type, name: N, container: C, metafilter: Metafilter? = nil) -> [Key] {
        let key = Key(type: type, name: name, container: container)
        return filter(key: key)
    }

     
     This method will always return either an empty array or an array with one element.
    */
    public static func filter<M>(key: Key, metafilter: Metafilter<M>) -> [Key] {
        return lock.read {
            guard let dependency = registrations[key] else { return [] }
            if let metadata = dependency.metadata as? M, metafilter(metadata) { return [key] }
            return []
        }
    }
    
    public static  func filter(key: Key) -> [Key] {
        return lock.read { registrations[key] == nil ? [] : [key] }
    }
    
    /**
