package de.take_weiland.mods.commons.internal.tonbt;
import cpw.mods.fml.common.LoaderState;
import de.take_weiland.mods.commons.internal.SevenCommons;
import de.take_weiland.mods.commons.internal.TypeToFactoryMap;
import de.take_weiland.mods.commons.internal.prop.AbstractProperty;
import de.take_weiland.mods.commons.nbt.NBTSerializer;
import de.take_weiland.mods.commons.nbt.NBTSerializerFactory;
import de.take_weiland.mods.commons.nbt.ToNbt;
import de.take_weiland.mods.commons.serialize.Property;
import javax.annotation.Nonnull;
import java.util.List;
/**
* @author diesieben07
*/
public final class ToNbtFactories {
private static final ToNbtHandlerFactory factory = new DefaultHandlerFactory();
private static final ClassValue<ToNbtHandler> handlerCV = new ClassValue<ToNbtHandler>() {
@Override
protected synchronized ToNbtHandler computeValue(@Nonnull Class<?> type) {
return factory.getHandler(type);
}
};
private static final TypeToFactoryMap<NBTSerializerFactory, NBTSerializer<?>> serializerFactories = new TypeToFactoryMap<NBTSerializerFactory, NBTSerializer<?>>() {
@Override
protected NBTSerializer<?> applyFactory(NBTSerializerFactory factory, Property<?, ?> type) {
return factory.get(type);
}
};
static {
SevenCommons.registerStateCallback(LoaderState.ModState.POSTINITIALIZED, new Runnable() {
@Override
public void run() {
serializerFactories.freeze();
}
});
}
public static void registerFactory(Class<?> baseType, NBTSerializerFactory factory) {
serializerFactories.register(baseType, factory);
}
static NBTSerializer<?> serializerFor(Property<?, ?> property) {
return serializerFactories.get(property);
}
public static ToNbtHandler handlerFor(Class<?> clazz) {
return handlerCV.get(clazz);
}
static List<Property<?, ?>> getProperties(Class<?> clazz) {
return AbstractProperty.allProperties(clazz, ToNbt.class);
}
}