package gw.internal.gosu.dynamic;
import gw.lang.reflect.IPlaceholder;
import gw.lang.reflect.IType;
import gw.lang.reflect.ITypeInfo;
import gw.lang.reflect.ITypeLoader;
import gw.lang.reflect.ITypeRef;
import gw.lang.reflect.TypeBase;
import gw.util.concurrent.LockingLazyVar;
/**
*/
public class DynamicType extends TypeBase implements IPlaceholder
{
public static final String PKG = "dynamic";
public static final String RNAME = "Dynamic";
public static final String QNAME = PKG +'.'+ RNAME;
private DynamicTypeLoader _typeLoader;
private LockingLazyVar<DynamicTypeInfo> _typeInfo;
private ITypeRef _typeRef;
public DynamicType( DynamicTypeLoader typeLoader )
{
_typeLoader = typeLoader;
_typeInfo =
new LockingLazyVar<DynamicTypeInfo>()
{
@Override
protected DynamicTypeInfo init()
{
return new DynamicTypeInfo( getOrCreateTypeReference() );
}
};
}
@Override
public boolean isPlaceholder()
{
return true;
}
@Override
public boolean isFinal() {
return true;
}
@Override
public String getName()
{
return QNAME;
}
@Override
public String getRelativeName()
{
return RNAME;
}
@Override
public String getNamespace()
{
return PKG;
}
@Override
public ITypeLoader getTypeLoader()
{
return _typeLoader;
}
@Override
public IType getSupertype()
{
return null;
}
@Override
public IType[] getInterfaces()
{
return IType.EMPTY_ARRAY;
}
@Override
public ITypeInfo getTypeInfo()
{
return _typeInfo.get();
}
@Override
public IType getComponentType() {
return getOrCreateTypeReference();
}
@Override
public boolean isAssignableFrom( IType type )
{
return !type.isPrimitive();
}
ITypeRef getOrCreateTypeReference()
{
if( _typeRef == null )
{
_typeRef = getTypeLoader().getModule().getModuleTypeLoader().getTypeRefFactory().create( this );
}
return _typeRef;
}
}