// Path: src/main/java/org/spearal/configuration/PropertyFactory.java
// public interface Property {
// 		
// 	String getName();
// 	Class<?> getType();
// 	Type getGenericType();
// 		
// 	boolean hasField();
// 	Field getField();
// 	boolean hasGetter();
// 	Method getGetter();
// 	boolean hasSetter();
// 	Method getSetter();
// 		
// 	Class<?> getDeclaringClass();
// 		
// 	Object init(ExtendedSpearalDecoder decoder, Object holder)
// 		throws InstantiationException, IllegalAccessException, InvocationTargetException;
// 		
// 	Object get(Object holder)
// 		throws IllegalAccessException, InvocationTargetException;
// 		
// 	void set(Object holder, Object value)
// 		throws IllegalAccessException, InvocationTargetException;
// 		
// 	boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
// 	<A extends Annotation> A getAnnotation(Class<A> annotationClass);
// 		
// 	boolean isReadOnly();
// 		
// 	public void write(ExtendedSpearalEncoder encoder, Object holder)
// 		throws IOException, IllegalAccessException, InvocationTargetException;
// 			
// 	public void read(ExtendedSpearalDecoder decoder, Object holder, int parameterizedType)
// 		throws IOException, InstantiationException, IllegalAccessException, InvocationTargetException;
// }
// 
// Path: src/main/java/org/spearal/impl/ExtendedSpearalDecoder.java
// public interface ExtendedSpearalDecoder extends SpearalDecoder {
// 
// 	Object readAny(int parameterizedType) throws IOException;
// 	Object readAny(int parameterizedType, Type targetType) throws IOException;
// 	void skipAny(int parameterizedType) throws IOException;
// 	
// 	SpearalDateTime readDateTime(int parameterizedType) throws IOException;
// 	
// 	long readIntegral(int parameterizedType) throws IOException;
// 	
// 	BigInteger readBigIntegral(int parameterizedType) throws IOException;
// 	
// 	double readFloating(int parameterizedType) throws IOException;
// 	
// 	BigDecimal readBigFloating(int parameterizedType) throws IOException;
// 
// 	String readString(int parameterizedType) throws IOException;
// 	
// 	byte[] readByteArray(int parameterizedType) throws IOException;
// 	
// 	Object readCollection(int parameterizedType, Type targetType) throws IOException;
// 	void readCollection(int parameterizedType, Object holder, Property property)
// 		throws IOException, InstantiationException, IllegalAccessException, InvocationTargetException;
// 
// 	Map<?, ?> readMap(int parameterizedType, Type targetType) throws IOException;
// 	void readMap(int parameterizedType, Object holder, Property property)
// 		throws IOException, InstantiationException, IllegalAccessException, InvocationTargetException;
// 	
// 	Enum<?> readEnum(int parameterizedType, Type targetType) throws IOException;
// 
// 	Class<?> readClass(int parameterizedType, Type targetType) throws IOException;
// 	
// 	Object readBean(int parameterizedType, Type targetType) throws IOException;
// }
// 
// Path: src/main/java/org/spearal/impl/ExtendedSpearalEncoder.java
// public interface ExtendedSpearalEncoder extends SpearalEncoder {
// 	
// 	void writeNull() throws IOException;
// 	
// 	void writeBoolean(boolean value) throws IOException;
// 
// 	void writeDateTime(SpearalDateTime value) throws IOException;
// 
// 	void writeByte(byte value) throws IOException;
// 	void writeShort(short value) throws IOException;
// 	void writeInt(int value) throws IOException;
// 	void writeLong(long value) throws IOException;
// 	void writeBigInteger(BigInteger value) throws IOException;
// 
// 	void writeFloat(float value) throws IOException;
// 	void writeDouble(double value) throws IOException;
// 	void writeBigDecimal(BigDecimal value) throws IOException;
// 
// 	void writeChar(char value) throws IOException;
// 	void writeString(String value) throws IOException;
// 	
// 	void writeByteArray(byte[] value) throws IOException;
// 	void writeArray(Object value) throws IOException;
// 	
// 	void writeCollection(Collection<?> value) throws IOException;
// 	void writeMap(Map<?, ?> value) throws IOException;
// 	
// 	void writeEnum(Enum<?> value) throws IOException;
// 	void writeClass(Class<?> value) throws IOException;
// 	void writeBean(Object value) throws IOException;
// }


import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import org.spearal.configuration.PropertyFactory.Property;
import org.spearal.impl.ExtendedSpearalDecoder;
import org.spearal.impl.ExtendedSpearalEncoder;
	@Override
	public Field getField() {
		return field;
	}

	@Override
	public boolean hasGetter() {
		return getter != null;
	}

	@Override
	public Method getGetter() {
		return getter;
	}

	@Override
	public boolean hasSetter() {
		return setter != null;
	}

	@Override
	public Method getSetter() {
		return setter;
	}

	@Override
	public Class<?> getDeclaringClass() {
		return (field != null ? field.getDeclaringClass() : getter.getDeclaringClass());
	}

// Path: src/main/java/org/spearal/configuration/PropertyFactory.java
// public interface Property {
// 		
// 	String getName();
// 	Class<?> getType();
// 	Type getGenericType();
// 		
// 	boolean hasField();
// 	Field getField();
// 	boolean hasGetter();
// 	Method getGetter();
// 	boolean hasSetter();
// 	Method getSetter();
// 		
// 	Class<?> getDeclaringClass();
// 		
// 	Object init(ExtendedSpearalDecoder decoder, Object holder)
// 		throws InstantiationException, IllegalAccessException, InvocationTargetException;
// 		
// 	Object get(Object holder)
// 		throws IllegalAccessException, InvocationTargetException;
// 		
// 	void set(Object holder, Object value)
// 		throws IllegalAccessException, InvocationTargetException;
// 		
// 	boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
// 	<A extends Annotation> A getAnnotation(Class<A> annotationClass);
// 		
// 	boolean isReadOnly();
// 		
// 	public void write(ExtendedSpearalEncoder encoder, Object holder)
// 		throws IOException, IllegalAccessException, InvocationTargetException;
// 			
// 	public void read(ExtendedSpearalDecoder decoder, Object holder, int parameterizedType)
// 		throws IOException, InstantiationException, IllegalAccessException, InvocationTargetException;
// }
// 
// Path: src/main/java/org/spearal/impl/ExtendedSpearalDecoder.java
// public interface ExtendedSpearalDecoder extends SpearalDecoder {
// 
// 	Object readAny(int parameterizedType) throws IOException;
// 	Object readAny(int parameterizedType, Type targetType) throws IOException;
// 	void skipAny(int parameterizedType) throws IOException;
// 	
// 	SpearalDateTime readDateTime(int parameterizedType) throws IOException;
// 	
// 	long readIntegral(int parameterizedType) throws IOException;
// 	
// 	BigInteger readBigIntegral(int parameterizedType) throws IOException;
// 	
// 	double readFloating(int parameterizedType) throws IOException;
// 	
// 	BigDecimal readBigFloating(int parameterizedType) throws IOException;
// 
// 	String readString(int parameterizedType) throws IOException;
// 	
// 	byte[] readByteArray(int parameterizedType) throws IOException;
// 	
// 	Object readCollection(int parameterizedType, Type targetType) throws IOException;
// 	void readCollection(int parameterizedType, Object holder, Property property)
// 		throws IOException, InstantiationException, IllegalAccessException, InvocationTargetException;
// 
// 	Map<?, ?> readMap(int parameterizedType, Type targetType) throws IOException;
// 	void readMap(int parameterizedType, Object holder, Property property)
// 		throws IOException, InstantiationException, IllegalAccessException, InvocationTargetException;
// 	
// 	Enum<?> readEnum(int parameterizedType, Type targetType) throws IOException;
// 
// 	Class<?> readClass(int parameterizedType, Type targetType) throws IOException;
// 	
// 	Object readBean(int parameterizedType, Type targetType) throws IOException;
// }
// 
// Path: src/main/java/org/spearal/impl/ExtendedSpearalEncoder.java
// public interface ExtendedSpearalEncoder extends SpearalEncoder {
// 	
// 	void writeNull() throws IOException;
// 	
// 	void writeBoolean(boolean value) throws IOException;
// 
// 	void writeDateTime(SpearalDateTime value) throws IOException;
// 
// 	void writeByte(byte value) throws IOException;
// 	void writeShort(short value) throws IOException;
// 	void writeInt(int value) throws IOException;
// 	void writeLong(long value) throws IOException;
// 	void writeBigInteger(BigInteger value) throws IOException;
// 
// 	void writeFloat(float value) throws IOException;
// 	void writeDouble(double value) throws IOException;
// 	void writeBigDecimal(BigDecimal value) throws IOException;
// 
// 	void writeChar(char value) throws IOException;
// 	void writeString(String value) throws IOException;
// 	
// 	void writeByteArray(byte[] value) throws IOException;
// 	void writeArray(Object value) throws IOException;
// 	
// 	void writeCollection(Collection<?> value) throws IOException;
// 	void writeMap(Map<?, ?> value) throws IOException;
// 	
// 	void writeEnum(Enum<?> value) throws IOException;
// 	void writeClass(Class<?> value) throws IOException;
// 	void writeBean(Object value) throws IOException;
// }


// Path: src/main/java/org/spearal/impl/property/AnyProperty.java
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import org.spearal.configuration.PropertyFactory.Property;
import org.spearal.impl.ExtendedSpearalDecoder;
import org.spearal.impl.ExtendedSpearalEncoder;

	@Override
	public Field getField() {
		return field;
	}

	@Override
	public boolean hasGetter() {
		return getter != null;
	}

	@Override
	public Method getGetter() {
		return getter;
	}

	@Override
	public boolean hasSetter() {
		return setter != null;
	}

	@Override
	public Method getSetter() {
		return setter;
	}

	@Override
	public Class<?> getDeclaringClass() {
		return (field != null ? field.getDeclaringClass() : getter.getDeclaringClass());
	}

	@Override