// Path: src/main/java/org/inventivetalent/nbt/NBTTag.java
// public abstract class NBTTag<V> {
// 
// 	public static NMSClassResolver NMS_CLASS_RESOLVER = new NMSClassResolver();
// 
// 	private final String name;
// 
// 	public NBTTag(String name) {
// 		this.name = name;
// 	}
// 
// 	public NBTTag(String name, Object nmsTag) {
// 		this.name = name;
// 
// 	}
// 
// 	public static NBTTag createType(int type) throws IllegalAccessException, InstantiationException {
// 		return forType(type).newInstance();
// 	}
// 
// 	public static NBTTag createType(int type, String name) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
// 		return forType(type).getConstructor(String.class).newInstance(name);
// 	}
// 
// 	public static Class<? extends NBTTag> forType(int type) {
// 		switch (type) {
// 			case TAG_BYTE_ARRAY:
// 				return ByteArrayTag.class;
// 			case TAG_BYTE:
// 				return ByteTag.class;
// 			case TAG_COMPOUND:
// 				return CompoundTag.class;
// 			case TAG_DOUBLE:
// 				return DoubleTag.class;
// 			case TAG_END:
// 				return EndTag.class;
// 			case TAG_FLOAT:
// 				return FloatTag.class;
// 			case TAG_INT_ARRAY:
// 				return IntArrayTag.class;
// 			case TAG_INT:
// 				return IntTag.class;
// 			case TAG_LIST:
// 				return ListTag.class;
// 			case TAG_LONG:
// 				return LongTag.class;
// 			case TAG_SHORT:
// 				return ShortTag.class;
// 			case TAG_STRING:
// 				return StringTag.class;
// 			case TAG_LONG_ARRAY:
// 				return LongArrayTag.class;
// 			default:
// 				throw new IllegalArgumentException("Invalid NBTTag type " + type);
// 		}
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public abstract V getValue();
// 
// 	public abstract void setValue(V v);
// 
// 	// getAs methods
// 
// 	public Number getAsNumber() {
// 		return 0;
// 	}
// 
// 	public byte getAsByte() {
// 		return getAsNumber().byteValue();
// 	}
// 
// 	public short getAsShort() {
// 		return getAsNumber().shortValue();
// 	}
// 
// 	public int getAsInt() {
// 		return getAsNumber().intValue();
// 	}
// 
// 	public long getAsLong() {
// 		return getAsNumber().longValue();
// 	}
// 
// 	public float getAsFloat() {
// 		return getAsNumber().floatValue();
// 	}
// 
// 	public double getAsDouble() {
// 		return getAsNumber().doubleValue();
// 	}
// 
// 	public String getAsString() {
// 		return String.valueOf(getValue());
// 	}
// 
// 	// /getAs methods
// 
// 	public abstract JsonElement asJson();
// 
// 	public abstract int getTypeId();
// 
// 	public abstract String getTypeName();
// 
// 	public void read(NBTInputStream nbtIn, DataInputStream in, int depth) throws IOException {
// 	}
// 
// 	public void write(NBTOutputStream nbtOut, DataOutputStream out) throws IOException {
// 	}
// 
// 	public String getNMSClass() {
// 		return "NBTBase";
// 	}
// 
// 	public NBTTag fromNMS(Object nms) throws ReflectiveOperationException {
// 		Class<?> clazz = NMS_CLASS_RESOLVER.resolve(getNMSClass());
// 		Field field = clazz.getDeclaredField("data");
// 		field.setAccessible(true);
// 		setValue((V) field.get(nms));
// 		return this;
// 	}
// 
// 	public Object toNMS() throws ReflectiveOperationException {
// 		Class<?> clazz = NMS_CLASS_RESOLVER.resolve(getNMSClass());
// 		Constructor constructor = null;
// 		for (Constructor constr : clazz.getConstructors()) {
// 			if (constr.getParameterTypes().length == 1) {
// 				constructor = constr;
// 				break;
// 			}
// 		}
// 		if (constructor == null) { return null; }
// 		return constructor.newInstance(getValue());
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return getTypeName() + "(" + getName() + "): " + getValue();
// 	}
// }


import org.inventivetalent.nbt.NBTTag;
import java.lang.reflect.Method;
package org.inventivetalent.nbt.annotation;



public class NBTWriteMethod extends NBTMember {

	protected final Method method;

	public NBTWriteMethod(String[] key, int type, boolean write, NBTPriority priority, Object obj, Method method) {
		super(key, type, false, write, priority, obj);
		this.method = method;
	}

	@Override
// Path: src/main/java/org/inventivetalent/nbt/NBTTag.java
// public abstract class NBTTag<V> {
// 
// 	public static NMSClassResolver NMS_CLASS_RESOLVER = new NMSClassResolver();
// 
// 	private final String name;
// 
// 	public NBTTag(String name) {
// 		this.name = name;
// 	}
// 
// 	public NBTTag(String name, Object nmsTag) {
// 		this.name = name;
// 
// 	}
// 
// 	public static NBTTag createType(int type) throws IllegalAccessException, InstantiationException {
// 		return forType(type).newInstance();
// 	}
// 
// 	public static NBTTag createType(int type, String name) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
// 		return forType(type).getConstructor(String.class).newInstance(name);
// 	}
// 
// 	public static Class<? extends NBTTag> forType(int type) {
// 		switch (type) {
// 			case TAG_BYTE_ARRAY:
// 				return ByteArrayTag.class;
// 			case TAG_BYTE:
// 				return ByteTag.class;
// 			case TAG_COMPOUND:
// 				return CompoundTag.class;
// 			case TAG_DOUBLE:
// 				return DoubleTag.class;
// 			case TAG_END:
// 				return EndTag.class;
// 			case TAG_FLOAT:
// 				return FloatTag.class;
// 			case TAG_INT_ARRAY:
// 				return IntArrayTag.class;
// 			case TAG_INT:
// 				return IntTag.class;
// 			case TAG_LIST:
// 				return ListTag.class;
// 			case TAG_LONG:
// 				return LongTag.class;
// 			case TAG_SHORT:
// 				return ShortTag.class;
// 			case TAG_STRING:
// 				return StringTag.class;
// 			case TAG_LONG_ARRAY:
// 				return LongArrayTag.class;
// 			default:
// 				throw new IllegalArgumentException("Invalid NBTTag type " + type);
// 		}
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public abstract V getValue();
// 
// 	public abstract void setValue(V v);
// 
// 	// getAs methods
// 
// 	public Number getAsNumber() {
// 		return 0;
// 	}
// 
// 	public byte getAsByte() {
// 		return getAsNumber().byteValue();
// 	}
// 
// 	public short getAsShort() {
// 		return getAsNumber().shortValue();
// 	}
// 
// 	public int getAsInt() {
// 		return getAsNumber().intValue();
// 	}
// 
// 	public long getAsLong() {
// 		return getAsNumber().longValue();
// 	}
// 
// 	public float getAsFloat() {
// 		return getAsNumber().floatValue();
// 	}
// 
// 	public double getAsDouble() {
// 		return getAsNumber().doubleValue();
// 	}
// 
// 	public String getAsString() {
// 		return String.valueOf(getValue());
// 	}
// 
// 	// /getAs methods
// 
// 	public abstract JsonElement asJson();
// 
// 	public abstract int getTypeId();
// 
// 	public abstract String getTypeName();
// 
// 	public void read(NBTInputStream nbtIn, DataInputStream in, int depth) throws IOException {
// 	}
// 
// 	public void write(NBTOutputStream nbtOut, DataOutputStream out) throws IOException {
// 	}
// 
// 	public String getNMSClass() {
// 		return "NBTBase";
// 	}
// 
// 	public NBTTag fromNMS(Object nms) throws ReflectiveOperationException {
// 		Class<?> clazz = NMS_CLASS_RESOLVER.resolve(getNMSClass());
// 		Field field = clazz.getDeclaredField("data");
// 		field.setAccessible(true);
// 		setValue((V) field.get(nms));
// 		return this;
// 	}
// 
// 	public Object toNMS() throws ReflectiveOperationException {
// 		Class<?> clazz = NMS_CLASS_RESOLVER.resolve(getNMSClass());
// 		Constructor constructor = null;
// 		for (Constructor constr : clazz.getConstructors()) {
// 			if (constr.getParameterTypes().length == 1) {
// 				constructor = constr;
// 				break;
// 			}
// 		}
// 		if (constructor == null) { return null; }
// 		return constructor.newInstance(getValue());
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return getTypeName() + "(" + getName() + "): " + getValue();
// 	}
// }


// Path: src/main/java/org/inventivetalent/nbt/annotation/NBTWriteMethod.java
import org.inventivetalent.nbt.NBTTag;
import java.lang.reflect.Method;

package org.inventivetalent.nbt.annotation;



public class NBTWriteMethod extends NBTMember {

	protected final Method method;

	public NBTWriteMethod(String[] key, int type, boolean write, NBTPriority priority, Object obj, Method method) {
		super(key, type, false, write, priority, obj);
		this.method = method;
	}

	@Override
	public void read(NBTTag tag) {