+ public static Consumer<Component<?>> asConsumer() {
+ return (c) -> registerComponent(c);
+ }
+
+// public static BiFunction<Class<?>, Predicate<Map<String, Object>>, Component<?>> asProvider() {
+//
+// }
+
+ static synchronized <T> Component<? extends T> find(Class<T> clss, Predicate<Map<String, Object>> filter) {
+ Set<Component<? extends T>> result = new HashSet<>();
+ instances: for (Object instance : components.keySet()) {
+ if (!clss.isAssignableFrom(instance.getClass()))
+ continue instances;
+ Component<? extends T> component = (Component<? extends T>) components.get(instance);
+
+ // TODO filter
+ if (component.isPublishedType(clss))
+ result.add(component);
+ }
+ if (result.isEmpty())
+ return null;
+ return result.iterator().next();
+
+ }
+