package org.robobinding.widgetaddon; import java.util.Map; import org.robobinding.util.Maps; import org.robobinding.util.SearchableClasses; /** * @since 1.0 * @author Cheng Wei * */ class ViewAddOnFactories { private final Map<Class<?>, ViewAddOnFactory> mappings; private final SearchableClasses searchableViewClasses; public ViewAddOnFactories(Map<Class<?>, ViewAddOnFactory> mappings) { this.mappings = Maps.newHashMap(mappings); searchableViewClasses = new SearchableClasses(mappings.keySet()); } public ViewAddOn createViewAddOn(Object view) { Class<?> viewClass = view.getClass(); ViewAddOnFactory factory = findMostSuitable(viewClass); if (factory == null) { throw new RuntimeException("no ViewAddOn registered for " + viewClass.getName()); } return factory.create(view); } private ViewAddOnFactory findMostSuitable(Class<?> viewClass) { Class<?> foundViewClass = searchableViewClasses.findNearestAssignableFrom(viewClass); if (foundViewClass == null) { return null; } else { return mappings.get(foundViewClass); } } }