/// <summary>
        /// Callback from InternalAPIAccess to process a single Animator state.
        /// </summary>
        /// <param name="layer">Layer index.</param>
        /// <param name="layerName">Layer name.</param>
        /// <param name="item">State name.</param>
        public void ProcessAnimatorState(StateInfo info)
        {
            string layerPrefix = (info.Layer > 0 || config.ForceLayerPrefix ? null : info.LayerName);
            string name        = CodeGenerationUtils.GenerateStateName(config.AnimatorStatePrefix, info.Name, layerPrefix);

            name = name.FirstCharToUpper();
            string fieldName = CodeGenerationUtils.GenerateStateName(config.AnimatorStateHashPrefix, info.Name, layerPrefix);

            fieldName = fieldName.FirstCharToLower();
            // field declaration
            GenericFieldCodeElement field = new GenericFieldCodeElement(typeof(int), fieldName, "" + info.Id);

            field.ReadOnly = true;
            field.Summary.Add("Hash of Animator state " + info.Name);
            classCodeElement.Fields.Add(field);
            string methodName = "Is" + name;
            // IsXXX method ()
            MethodCodeElement <bool> method = new MethodCodeElement <bool> (methodName);

            method.Origin = "state " + info.Name;
            method.Code.Add("return " + fieldName + " == animator.GetCurrentAnimatorStateInfo (" + info.Layer + ").nameHash" + ";");
            method.Summary.Add("true if the current Animator state of layer " + info.Layer + " is  \"" + info.Name + "\".");
            classCodeElement.Methods.Add(method);
            // overloaded IsXXX (int nameHash)
            MethodCodeElement <bool> methodWithLayerParameter = new MethodCodeElement <bool> (methodName);

            methodWithLayerParameter.Origin = "state " + info.Name;
            methodWithLayerParameter.AddParameter(typeof(int), "nameHash");
            methodWithLayerParameter.Code.Add("return nameHash == " + fieldName + ";");
            methodWithLayerParameter.Summary.Add("true if the given (state) nameHash equals Animator.StringToHash (\"" + info.Name + "\").");
            classCodeElement.Methods.Add(methodWithLayerParameter);
            // state dictionary is filled in overriden method InitialiseEventManager
            object [] parameters = new object[] { info.Id,
                                                  info.Layer,
                                                  info.LayerName,
                                                  info.Name,
                                                  info.Tag,
                                                  info.Speed,
                                                  info.FootIK,
                                                  info.Mirror,
                                                  info.Motion.Name,
                                                  info.Motion.Duration };
            string parameterList = CodeElementUtils.GetCallParameterString(parameters);

            EventManagerInitialiser.Code.Add(StateInfoDict + ".Add (" + info.Id + ", new StateInfo (" + parameterList + "));");
        }
        /// <summary>
        /// Callback from InternalAPIAccess to process a single parameter. Hopefully this remains stable on API changes.
        /// </summary>
        /// <param name="t">Type of parameter in our representation.</param>
        /// <param name="item">Raw parameter name.</param>
        /// <param name="defaultValue">Default value.</param>
        public void ProcessAnimatorParameter(AnimatorParameterType t, string item, string defaultValue)
        {
            string propName   = CodeGenerationUtils.GeneratePropertyName(config.ParameterPrefix, item);
            string getterName = "Get" + propName;
            string setterName = "Set" + propName;
            string fieldName  = CodeGenerationUtils.GeneratePropertyName(config.ParameterHashPrefix, item);

            fieldName = fieldName.FirstCharToLower();
            VoidMethodCodeElement    setterMethod = new VoidMethodCodeElement(setterName);
            GenericMethodCodeElement getterMethod = null;
            GenericFieldCodeElement  field        = new FieldCodeElement <int> (fieldName, "" + Animator.StringToHash(item));

            field.ReadOnly = true;
            if (t == AnimatorParameterType.Bool)
            {
                getterMethod = new MethodCodeElement <bool> (getterName);
                getterMethod.Summary.Add("Access to boolean parameter " + item + ", default is: " + defaultValue + ".");
                getterMethod.Code.Add("return animator.GetBool (" + fieldName + ");");
                setterMethod.Summary.Add("Set boolean value of parameter " + item + ".");
                setterMethod.Summary.Add("<param name=\"newValue\">New value for boolean parameter " + item + ".</param>");
                setterMethod.AddParameter(typeof(bool), "newValue");
                setterMethod.Code.Add("animator.SetBool (" + fieldName + ", newValue);");
            }
            else if (t == AnimatorParameterType.Float)
            {
                getterMethod = new MethodCodeElement <float> (getterName);
                getterMethod.Summary.Add("Access to float parameter " + item + ", default is: " + defaultValue + ".");
                getterMethod.Code.Add("return animator.GetFloat (" + fieldName + ");");
                setterMethod.Summary.Add("Set float value of parameter " + item + ".");
                setterMethod.Summary.Add("<param name=\"newValue\">New value for float parameter " + item + ".</param>");
                setterMethod.AddParameter(typeof(float), "newValue");
                setterMethod.Code.Add("animator.SetFloat (" + fieldName + ", newValue);");
                // special case for float: provide setter with dampTime and deltaTime
                VoidMethodCodeElement methodExtended = new VoidMethodCodeElement(setterName);
                methodExtended.AddParameter(typeof(float), "newValue");
                methodExtended.AddParameter(typeof(float), "dampTime");
                methodExtended.AddParameter(typeof(float), "deltaTime");
                methodExtended.Summary.Add("Set float parameter of " + item + " using damp and delta time .");
                methodExtended.Summary.Add("<param name=\"newValue\">New value for float parameter " + item + ".</param>");
                methodExtended.Summary.Add("<param name=\"dampTime\">The time allowed to parameter " + item + " to reach the value.</param>");
                methodExtended.Summary.Add("<param name=\"deltaTime\">The current frame deltaTime.</param>");
                methodExtended.Code.Add("animator.SetFloat (" + fieldName + ", newValue, dampTime, deltaTime);");
                classCodeElement.Methods.Add(methodExtended);
            }
            else if (t == AnimatorParameterType.Int)
            {
                getterMethod = new MethodCodeElement <int> (getterName);
                getterMethod.Summary.Add("Access to integer parameter " + item + ", default is: " + defaultValue + ".");
                getterMethod.Code.Add("return animator.GetInteger (" + fieldName + ");");
                setterMethod.Summary.Add("Set integer value of parameter " + item + ".");
                setterMethod.Summary.Add("<param name=\"newValue\">New value for integer parameter " + item + ".</param>");
                setterMethod.AddParameter(typeof(int), "newValue");
                setterMethod.Code.Add("animator.SetInteger (" + fieldName + ", newValue);");
            }
            else if (t == AnimatorParameterType.Trigger)
            {
                setterMethod.Summary.Add("Activate trigger of parameter " + item + ".");
                setterMethod.Code.Add("animator.SetTrigger (" + fieldName + ");");
            }
            else
            {
                Logger.Warning("Could not find type for param " + item + " as it seems to be no base type.");
                return;
            }
            classCodeElement.Methods.Add(setterMethod);
            if (getterMethod != null)
            {
                classCodeElement.Methods.Add(getterMethod);
            }
            field.Summary.Add("Hash of parameter " + item);
            classCodeElement.Fields.Add(field);
        }
		/// <summary>
		/// Callback from InternalAPIAccess to process a single parameter. Hopefully this remains stable on API changes.
		/// </summary>
		/// <param name="t">Type of parameter in our representation.</param>
		/// <param name="item">Raw parameter name.</param>
		/// <param name="defaultValue">Default value.</param>
		public void ProcessAnimatorParameter (AnimatorParameterType t, string item, string defaultValue) {
			string propName = CodeGenerationUtils.GeneratePropertyName (config.ParameterPrefix, item);
			string getterName = "Get" + propName;
			string setterName = "Set" + propName;
			string fieldName = CodeGenerationUtils.GeneratePropertyName (config.ParameterHashPrefix, item);
			fieldName = fieldName.FirstCharToLower ();
			VoidMethodCodeElement setterMethod = new VoidMethodCodeElement (setterName);
			GenericMethodCodeElement getterMethod = null;
			GenericFieldCodeElement field = new FieldCodeElement<int> (fieldName, "" + Animator.StringToHash (item));
			field.ReadOnly = true;
			if (t == AnimatorParameterType.Bool) {
				getterMethod = new MethodCodeElement<bool> (getterName);
				getterMethod.Summary.Add ("Access to boolean parameter " + item + ", default is: " + defaultValue + ".");
				getterMethod.Code.Add ("return animator.GetBool (" + fieldName + ");");
				setterMethod.Summary.Add ("Set boolean value of parameter " + item + ".");
				setterMethod.Summary.Add ("<param name=\"newValue\">New value for boolean parameter " + item + ".</param>");
				setterMethod.AddParameter (typeof (bool), "newValue");
				setterMethod.Code.Add ("animator.SetBool (" + fieldName + ", newValue);");
			} else if (t == AnimatorParameterType.Float) {
				getterMethod = new MethodCodeElement<float> (getterName);
				getterMethod.Summary.Add ("Access to float parameter " + item + ", default is: " + defaultValue + ".");
				getterMethod.Code.Add ("return animator.GetFloat (" + fieldName + ");");
				setterMethod.Summary.Add ("Set float value of parameter " + item + ".");
				setterMethod.Summary.Add ("<param name=\"newValue\">New value for float parameter " + item + ".</param>");
				setterMethod.AddParameter (typeof (float), "newValue");
				setterMethod.Code.Add ("animator.SetFloat (" + fieldName + ", newValue);");
				// special case for float: provide setter with dampTime and deltaTime
				VoidMethodCodeElement methodExtended = new VoidMethodCodeElement (setterName);
				methodExtended.AddParameter (typeof (float), "newValue");
				methodExtended.AddParameter (typeof (float), "dampTime");
				methodExtended.AddParameter (typeof (float), "deltaTime");
				methodExtended.Summary.Add ("Set float parameter of " + item + " using damp and delta time .");
				methodExtended.Summary.Add ("<param name=\"newValue\">New value for float parameter " + item + ".</param>");
				methodExtended.Summary.Add ("<param name=\"dampTime\">The time allowed to parameter " + item + " to reach the value.</param>");
				methodExtended.Summary.Add ("<param name=\"deltaTime\">The current frame deltaTime.</param>");
				methodExtended.Code.Add ("animator.SetFloat (" + fieldName + ", newValue, dampTime, deltaTime);");
				classCodeElement.Methods.Add (methodExtended);
			} else if (t == AnimatorParameterType.Int) {
				getterMethod = new MethodCodeElement<int> (getterName);
				getterMethod.Summary.Add ("Access to integer parameter " + item + ", default is: " + defaultValue + ".");
				getterMethod.Code.Add ("return animator.GetInteger (" + fieldName + ");");
				setterMethod.Summary.Add ("Set integer value of parameter " + item + ".");
				setterMethod.Summary.Add ("<param name=\"newValue\">New value for integer parameter " + item + ".</param>");
				setterMethod.AddParameter (typeof (int), "newValue");
				setterMethod.Code.Add ("animator.SetInteger (" + fieldName + ", newValue);");
			} else if (t == AnimatorParameterType.Trigger) {
				setterMethod.Summary.Add ("Activate trigger of parameter " + item + ".");
				setterMethod.Code.Add ("animator.SetTrigger (" + fieldName + ");");
			} else {
				Logger.Warning ("Could not find type for param " + item + " as it seems to be no base type.");
				return;
			}
			classCodeElement.Methods.Add (setterMethod);
			if (getterMethod != null) {
				classCodeElement.Methods.Add (getterMethod);
			}
			field.Summary.Add ("Hash of parameter " + item);
			classCodeElement.Fields.Add (field);
		}
		/// <summary>
		/// Callback from InternalAPIAccess to process a single Animator state.
		/// </summary>
		/// <param name="layer">Layer index.</param>
		/// <param name="layerName">Layer name.</param>
		/// <param name="item">State name.</param>
		public void ProcessAnimatorState (StateInfo info) {
			string layerPrefix = (info.Layer > 0 || config.ForceLayerPrefix ? null : info.LayerName);
			string name = CodeGenerationUtils.GenerateStateName (config.AnimatorStatePrefix, info.Name, layerPrefix);
			name = name.FirstCharToUpper ();
			string fieldName = CodeGenerationUtils.GenerateStateName (config.AnimatorStateHashPrefix, info.Name, layerPrefix);
			fieldName = fieldName.FirstCharToLower ();
			// field declaration
			GenericFieldCodeElement field = new GenericFieldCodeElement (typeof(int), fieldName, "" + info.Id);
			field.ReadOnly = true;
			field.Summary.Add ("Hash of Animator state " + info.Name);
			classCodeElement.Fields.Add (field);
			string methodName = "Is" + name;
			// IsXXX method ()
			MethodCodeElement<bool> method = new MethodCodeElement<bool> (methodName);
			method.Origin = "state " + info.Name;
			method.Code.Add ("return " + fieldName + " == animator.GetCurrentAnimatorStateInfo (" + info.Layer + ").nameHash" + ";");
			method.Summary.Add ("true if the current Animator state of layer " + info.Layer + " is  \"" + info.Name + "\".");
			classCodeElement.Methods.Add (method);
			// overloaded IsXXX (int nameHash)
			MethodCodeElement<bool> methodWithLayerParameter = new MethodCodeElement<bool> (methodName);
			methodWithLayerParameter.Origin = "state " + info.Name;
			methodWithLayerParameter.AddParameter (typeof(int), "nameHash");
			methodWithLayerParameter.Code.Add ("return nameHash == " + fieldName + ";");
			methodWithLayerParameter.Summary.Add ("true if the given (state) nameHash equals Animator.StringToHash (\"" + info.Name + "\").");
			classCodeElement.Methods.Add (methodWithLayerParameter);
			// state dictionary is filled in overriden method InitialiseEventManager
			object [] parameters = new object[] {info.Id,
				info.Layer, 
				info.LayerName, 
				info.Name, 
				info.Tag, 
				info.Speed, 
				info.FootIK, 
				info.Mirror, 
				info.Motion.Name,
				info.Motion.Duration
			};
			string parameterList = CodeElementUtils.GetCallParameterString (parameters);
			EventManagerInitialiser.Code.Add (StateInfoDict + ".Add (" + info.Id + ", new StateInfo (" + parameterList + "));");
		}