/* * Copyright 2013. Guidewire Software, Inc. */ package gw.internal.gosu.dynamic; import gw.lang.reflect.BaseFeatureInfo; import gw.lang.reflect.Expando; import gw.lang.reflect.IAnnotationInfo; import gw.lang.reflect.IConstructorHandler; import gw.lang.reflect.IConstructorInfo; import gw.lang.reflect.IExceptionInfo; import gw.lang.reflect.IExpando; import gw.lang.reflect.IParameterInfo; import gw.lang.reflect.IType; import gw.lang.reflect.SimpleParameterInfo; import java.util.Collections; import java.util.List; /** */ public class DynamicConstructorInfo extends BaseFeatureInfo implements IConstructorInfo { private IParameterInfo[] _paramInfos; public DynamicConstructorInfo( DynamicTypeInfo dynamicTypeInfo, IType... paramTypes ) { super( dynamicTypeInfo ); makeParameters( paramTypes ); } private void makeParameters( IType[] paramTypes ) { _paramInfos = new IParameterInfo[paramTypes.length]; for( int i = 0; i < paramTypes.length; i++ ) { _paramInfos[i] = new SimpleParameterInfo( this, paramTypes[i], i ); } } @Override public boolean isStatic() { return false; } @Override public List<IAnnotationInfo> getDeclaredAnnotations() { return Collections.emptyList(); } @Override public String getName() { return DynamicType.RNAME + "()"; } @Override public IType getType() { return getOwnersType(); } @Override public IParameterInfo[] getParameters() { return _paramInfos; } @Override public IConstructorHandler getConstructor() { return new ConstructorHandler(); } @Override public List<IExceptionInfo> getExceptions() { return Collections.emptyList(); } @Override public boolean isDefault() { return true; } private class ConstructorHandler implements IConstructorHandler { @Override public Object newInstance( Object... args ) { if( args == null || args.length == 0 ) { return new Expando(); } else if( args.length == 1 && args[0] instanceof IExpando ) { return args[0]; } throw new IllegalArgumentException(); } } }