public override void Visit(IdentifierExpression identifier)
        {
            if (Parameters.ContainsKey(identifier.Name))
            {
                // The parameter is defined in the dictionary
                if (Parameters[identifier.Name] is Expression)
                {
                    // The parameter is itself another Expression
                    var expression = (Expression)Parameters[identifier.Name];

                    // Overloads parameters
                    foreach (var p in Parameters)
                    {
                        expression.Parameters[p.Key] = p.Value;
                    }

                    expression.EvaluateFunction  += EvaluateFunction;
                    expression.EvaluateParameter += EvaluateParameter;

                    Result = ((Expression)Parameters[identifier.Name]).Evaluate(flow);
                }
                else
                {
                    Result = Parameters[identifier.Name];
                }
            }
            else
            {
                // The parameter should be defined in a callback method
                var args = new ParameterArgs();

                // Calls external implementation
                OnEvaluateParameter(identifier.Name, args);

                if (!args.HasResult)
                {
                    throw new ArgumentException("Parameter was not defined", identifier.Name);
                }

                Result = args.Result;
            }
        }
 private void OnEvaluateParameter(string name, ParameterArgs args)
 {
     EvaluateParameter?.Invoke(flow, name, args);
 }