package gw.internal.gosu.dynamic; import gw.lang.reflect.IAnnotationInfo; import gw.lang.reflect.IExpando; import gw.lang.reflect.IPropertyAccessor; import gw.lang.reflect.IType; import gw.lang.reflect.ITypeInfo; import gw.lang.reflect.PropertyInfoBase; import gw.lang.reflect.ReflectUtil; import java.util.Collections; import java.util.List; /** */ public class DynamicPropertyInfo extends PropertyInfoBase implements IPropertyAccessor { private String _strName; DynamicPropertyInfo( ITypeInfo container, String strName ) { super( container ); _strName = strName; } @Override public boolean isReadable() { return true; } @Override public boolean isWritable( IType whosAskin ) { return true; } @Override public IPropertyAccessor getAccessor() { return this; } @Override public IType getFeatureType() { return getOwnersType(); } @Override public List<IAnnotationInfo> getDeclaredAnnotations() { return Collections.emptyList(); } @Override public boolean hasAnnotation( IType type ) { return false; } @Override public String getName() { return _strName; } @Override public Object getValue( Object ctx ) { if( ctx instanceof IExpando ) { return ((IExpando)ctx).getFieldValue( getName() ); } return ReflectUtil.getProperty( ctx, getName() ); } @Override public void setValue( Object ctx, Object value ) { if( ctx instanceof IExpando ) { ((IExpando)ctx).setFieldValue( getName(), value ); } else { ReflectUtil.setProperty( ctx, getName(), value ); } } }