package hu.swankey.ammo.common.yggdrasil.basics;

import hu.swankey.ammo.common.script.yunits.YAttribute;



public class StringField extends YAttribute {

    /** Instantiate a StringField with default value */
    public StringField(String name) {
        this(name, yclass(), null);
    }

    public StringField(String name, String value){
        this(name);
        setValue(value);
    }

    protected StringField(String name, StringType type, Object value){
        super(name, type, value);
    }
    
    public static StringType yclass(){
    	return StringType.singleton();
    }


    @Override
    public void setValue(Object value) {

        if (value instanceof String)
            super.setValue(value);
        else
            throw new RuntimeException("'value' should be String, but is is a '" +
            		(value == null? "null" : value.getClass()) + "'");
    }

    @Override
    public String getValue() {
        return (String) super.getValue();
    }

    @Override
    public String toString() {
        return "\"" + getValue() + "\"";
    }

    @Override
    public StringType getYClass() {
        return (StringType) super.getYClass();
    }
    
	public Object clone(){
		StringField newStr = new StringField(getName());
		newStr.setValue( getValue() );
		return newStr;
	}        
    
    public static class StringType extends FieldClass {

        private static final String CLASS_NAME = "String";
        private static final String DEFAULT_VALUE = "";

        private static StringType singleton;

    	public static StringType singleton(){
    		if (singleton == null){
    			singleton = new StringType(CLASS_NAME);
    			singleton.addSuperior( YAttribute.yclass() );
    			placeClass(singleton);
    		}
    		return singleton;
    	}

        /** Instantiate a specific StringType */
        protected StringType(String name) {
            super(name);
        }



//        @Override
//        public String getName() {
//            return CLASS_NAME;
//        }



	    public YObject create(String name) {
	         return new StringField(name, this, null);
	    }



        @Override
        public String getName() {
            return CLASS_NAME;
        }



        @Override
        public String getDefaultValue() {
            return DEFAULT_VALUE;
        }



    }
}