@Override
	public AbilityMapping newAbilityMapping()
	{
		return new AbilityMapping()
		{
			private String				ID						= "";
			private String				abilityID				= "";
			private int					qualLevel				= -1;
			private boolean				autoGain				= false;
			private int					defaultProficiency		= 0;
			private int					maxProficiency			= 100;
			private String				defaultParm				= "";
			private boolean				isSecret				= false;
			private boolean				isAllQualified			= false;
			private DVector				skillPreReqs			= new DVector(2);
			private String				extraMask				= "";
			private String				originalSkillPreReqList	= "";
			private Integer[]			costOverrides			= new Integer[Cost.values().length];
			private boolean				allQualifyFlag			= false;
			private Map<String, String>	extFields				= new Hashtable<String, String>(1);
			
			@Override
			public String ID()
			{
				return ID;
			}

			@Override
			public AbilityMapping ID(String newValue)
			{
				ID = newValue;
				return this;
			}

			@Override
			public String abilityID()
			{
				return abilityID;
			}
			
			@Override
			public AbilityMapping abilityID(String newValue)
			{
				abilityID = newValue;
				return this;
			}
			
			@Override
			public int qualLevel()
			{
				return qualLevel;
			}
			
			@Override
			public AbilityMapping qualLevel(int newValue)
			{
				qualLevel = newValue;
				return this;
			}

			@Override
			public boolean autoGain()
			{
				return autoGain;
			}

			@Override
			public AbilityMapping autoGain(boolean newValue)
			{
				autoGain = newValue;
				return this;
			}

			@Override
			public int defaultProficiency()
			{
				return defaultProficiency; 
			}
			
			@Override
			public AbilityMapping defaultProficiency(int newValue)
			{
				defaultProficiency = newValue;
				return this;
			}
			
			@Override
			public int maxProficiency()
			{
				return maxProficiency;
			}
			
			@Override
			public AbilityMapping maxProficiency(int newValue)
			{
				maxProficiency = newValue;
				return this;
			}
			
			@Override
			public String defaultParm()
			{
				return defaultParm;
			}
			
			@Override
			public AbilityMapping defaultParm(String newValue)
			{
				defaultParm = newValue;
				return this;
			}
			
			@Override
			public boolean isSecret()
			{
				return isSecret;
			}
			
			@Override
			public AbilityMapping isSecret(boolean newValue)
			{
				isSecret = newValue;
				return this;
			}
			
			@Override
			public boolean isAllQualified()
			{
				return isAllQualified;
			}
			
			@Override
			public AbilityMapping isAllQualified(boolean newValue)
			{
				isAllQualified = newValue;
				return this;
			}
			
			@Override
			public DVector skillPreReqs()
			{
				return skillPreReqs;
			}

			@Override
			public AbilityMapping skillPreReqs(DVector newValue)
			{
				skillPreReqs = newValue;
				return this;
			}

			@Override
			public String extraMask()
			{
				return extraMask;
			}

			@Override
			public AbilityMapping extraMask(String newValue)
			{
				extraMask = newValue;
				return this;
			}

			@Override
			public String originalSkillPreReqList()
			{
				return originalSkillPreReqList;
			}

			@Override
			public AbilityMapping originalSkillPreReqList(String newValue)
			{
				originalSkillPreReqList = newValue;
				return this;
			}

			@Override
			public Integer[] costOverrides()
			{
				return costOverrides;
			}

			@Override
			public AbilityMapping costOverrides(Integer[] newValue)
			{
				costOverrides = newValue;
				return this;
			}

			@Override
			public boolean allQualifyFlag()
			{
				return allQualifyFlag;
			}

			@Override
			public AbilityMapping allQualifyFlag(boolean newValue)
			{
				allQualifyFlag = newValue;
				return this;
			}

			@Override
			public Map<String, String> extFields()
			{
				return extFields;
			}

			@Override
			public AbilityMapping extFields(Map<String, String> newValue)
			{
				extFields = newValue;
				return this;
			}

			@Override
			public AbilityMapping copyOf()
			{
				final AbilityMapping map;
				try
				{
					map = (AbilityMapping) this.clone();
					map.skillPreReqs(skillPreReqs.copyOf());
					if(costOverrides != null)
						map.costOverrides(costOverrides.clone());
					map.extFields(new Hashtable<String,String>(extFields));
				}
				catch (CloneNotSupportedException e)
				{
					return this;
				}
				return map;
			}
		};
	}