package de.take_weiland.mods.commons.internal.tonbt; import java.util.HashMap; import java.util.Map; /** * @author diesieben07 */ final class DefaultHandlerFactory implements ToNbtHandlerFactory { private final Map<Class<?>, Class<? extends ToNbtHandler>> handlerClasses = new HashMap<>(); @Override public ToNbtHandler getHandler(Class<?> clazz) { Class<? extends ToNbtHandler> hClass = getHandlerClass(clazz); try { return hClass == null ? null : hClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new RuntimeException(); } } Class<? extends ToNbtHandler> getHandlerClass(Class<?> clazz) { if (clazz == Object.class) { return null; } Class<? extends ToNbtHandler> hClass; if (!handlerClasses.containsKey(clazz)) { hClass = new BytecodeEmittingHandlerGenerator(this, clazz).generateHandler(); if (hClass == null) { hClass = getHandlerClass(clazz.getSuperclass()); } handlerClasses.put(clazz, hClass); } else { hClass = handlerClasses.get(clazz); } return hClass; } }