/// <summary>
        /// get a valid parameter object by checking for it in the previously retrieved data store or by finding it based on the information provided by the user
        /// </summary>
        /// <param name="paramName">the parameter to retrieve</param>
        /// <param name="context"></param>
        /// <returns></returns>
        public virtual IParameterResult LookupParam(IFieldParameter param, IConversationContext context)
        {
            var c = context.GetCurrentConversation();

            var storedValue = c.Data.ContainsKey(param.ParamName)
                ? c.Data[param.ParamName]
                : null;

            if (storedValue != null && !storedValue.IsIncomplete)
            {
                return(ResultFactory.GetSuccess(storedValue.DisplayName, storedValue.Value));
            }

            string value = SearchUserValues(param.ParamName, context);

            if (string.IsNullOrEmpty(value))
            {
                return(ResultFactory.GetFailure());
            }

            var paramResult = param.GetParameter(value, context);

            if (paramResult.HasFailed)
            {
                return(paramResult);
            }

            if (IsParamRequest(param.ParamName, c)) // clear any request for this property
            {
                c.Data.Remove(ReqParam);
            }

            c.Data[param.ParamName] = new ParameterData {
                DisplayName = paramResult.DisplayName, Value = paramResult.DataValue
            };
            return(ResultFactory.GetSuccess(paramResult.DisplayName, paramResult.DataValue));
        }