package openmods.config;
import com.google.common.base.Throwables;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import openmods.config.game.RegisterBlock;
import openmods.config.game.RegisterItem;
public class FieldProcessor {
public interface FieldValueVisitor<T> {
public void visit(T value);
}
private static <A extends Annotation, T> void processEntries(Class<? extends InstanceContainer<T>> container, Class<? extends A> annotationCls, Class<T> fieldCls, FieldValueVisitor<T> visitor) {
for (Field f : container.getFields()) {
if (Modifier.isStatic(f.getModifiers()) && f.isAnnotationPresent(annotationCls)) {
try {
Object value = f.get(null);
T item = fieldCls.cast(value);
if (item != null) visitor.visit(item);
} catch (Throwable t) {
throw Throwables.propagate(t);
}
}
}
}
public static void processItems(Class<? extends ItemInstances> container, FieldValueVisitor<Item> visitor) {
processEntries(container, RegisterItem.class, Item.class, visitor);
}
public static void processBlocks(Class<? extends BlockInstances> container, FieldValueVisitor<Block> visitor) {
processEntries(container, RegisterBlock.class, Block.class, visitor);
}
}