/// <summary>
        /// Gets simple parameter value from it's markup.
        /// </summary>
        /// <returns></returns>
        public static object GetParameterValue(XElement parameterNode, ParameterProfile parameterProfile)
        {
            List<XElement> parameterElements = parameterNode.Elements(ParameterValueElementXName).ToList();
            if (parameterElements.Any())
            {
                return parameterElements.Select(element => element.Attribute("value").Value).ToList();
            }

            var valueAttr = parameterNode.Attribute("value");
            if (valueAttr != null)
            {
                try
                {
                    return XmlSerializationHelper.Deserialize(valueAttr, parameterProfile.Type);
                }
                catch (Exception ex)
                {
                    Log.LogError(LogTitle, ex);

                    return parameterProfile.GetDefaultValue();
                }
            }

            if (parameterNode.Elements().Any())
            {
                Type paramType = parameterProfile.Type;

                if (paramType.IsSubclassOf(typeof(XContainer))
                    || (paramType.IsLazyGenericType()
                        && paramType.GetGenericArguments()[0].IsSubclassOf(typeof(XContainer))))
                {
                    return ValueTypeConverter.Convert(parameterNode.Elements().First(), parameterProfile.Type);
                }

                throw new NotImplementedException("Not supported type of function parameter element node: '{0}'".FormatWith(paramType.FullName));
            }

            return parameterProfile.GetDefaultValue();
        }
        /// <exclude />
        public static void SetParameterValue(XElement functionMarkup, ParameterProfile parameter, object parameterValue)
        {
            bool newValueNotEmpty = parameterValue != null
	                                && (!(parameterValue is IList) || ((IList) parameterValue).Count > 0)
	                                && !(parameter.IsRequired && parameterValue as string == string.Empty);

            var parameterNode = functionMarkup.Elements(ParameterNodeXName).FirstOrDefault(p => (string)p.Attribute("name") == parameter.Name);

	        if (parameterNode != null)
	        {
                parameterNode.Remove();
	        }

	        if (newValueNotEmpty && parameterValue != parameter.GetDefaultValue())
	        {
	            var newConstantParam = new ConstantObjectParameterRuntimeTreeNode(parameter.Name, parameterValue);

	            functionMarkup.Add(newConstantParam.Serialize());
	        }
        }