package com.bergerkiller.bukkit.common.reflection; import com.bergerkiller.bukkit.common.conversion.Converter; import com.bergerkiller.bukkit.common.conversion.ConverterPair; /** * A field accessor that can translate from one type to another to expose a different type than is stored * * @param <T> Type exposed */ public class TranslatorFieldAccessor<T> implements FieldAccessor<T> { private final FieldAccessor<Object> base; private final ConverterPair<Object, T> converterPair; @SuppressWarnings("unchecked") public TranslatorFieldAccessor(FieldAccessor<?> base, Converter<?> setConverter, Converter<T> getConverter) { this(base, new ConverterPair<Object, T>((Converter<Object>) setConverter, getConverter)); } @SuppressWarnings("unchecked") public TranslatorFieldAccessor(FieldAccessor<?> base, ConverterPair<?, T> converterPair) { if (base == null) { throw new IllegalArgumentException("Can not construct using a null base"); } if (converterPair == null) { throw new IllegalArgumentException("Can not construct using a null converter pair"); } this.base = (FieldAccessor<Object>) base; this.converterPair = (ConverterPair<Object, T>) converterPair; } @Override public boolean isValid() { return base.isValid(); } /** * Gets the internally stored value from an instance * * @param instance containing this Field * @return field value from instance */ public Object getInternal(Object instance) { return base.get(instance); } /** * Sets the internally stored value for an instance * * @param instance containing this Field * @param value to set the field to * @return True if successful, False if not */ public boolean setInternal(Object instance, Object value) { return base.set(instance, value); } @Override public T get(Object instance) { return converterPair.convertB(getInternal(instance)); } @Override public boolean set(Object instance, T value) { return setInternal(instance, converterPair.convertA(value)); } @Override public T transfer(Object from, Object to) { return converterPair.convertB(base.transfer(from, to)); } @Override public <K> TranslatorFieldAccessor<K> translate(ConverterPair<?, K> converterPair) { return new TranslatorFieldAccessor<K>(this, converterPair); } }