package net.tomatentum.cutin.container; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.tomatentum.cutin.ReflectedMethodFactory; import net.tomatentum.cutin.method.ReflectedMethod; public class LoneMethodContainer implements MethodContainer { private Logger logger = LoggerFactory.getLogger(getClass()); private Map> methodStore; private ReflectedMethodFactory factory; public LoneMethodContainer(ReflectedMethodFactory factory) { this.methodStore = new HashMap<>(); this.factory = factory; } @Override public MethodContainer addMethod(ReflectedMethod method) { this.methodStore.put(method.identifier(), method); logger.debug("Added {} to container", method); return this; } @Override public MethodContainer addMethods(Object containingObject, Method... methods) { for (Method method : methods) this.factory.produce(method, containingObject) .ifPresent(this::addMethod); return this; } @Override public Set identifiers() { return methodStore.keySet(); } @Override public Collection> methods() { return this.methodStore.values(); } @Override public Collection> findFor(I identifier) { ReflectedMethod result = this.methodStore.get(identifier); return result != null ? Arrays.asList(result) : Collections.emptyList(); } @Override public Optional> findFirstFor(I identifier) { return findFor(identifier).stream().findFirst(); } public ReflectedMethodFactory factory() { return this.factory; } }