public virtual IVariableInstance GetVariableInstance(string variableName, bool fetchAllVariables)
        {
            // Transient variable
            if (transientVariabes != null && transientVariabes.ContainsKey(variableName))
            {
                return(transientVariabes[variableName]);
            }

            // Check the local single-fetch cache
            if (usedVariablesCache.ContainsKey(variableName))
            {
                return(usedVariablesCache[variableName]);
            }

            if (fetchAllVariables == true)
            {
                EnsureVariableInstancesInitialized();
                variableInstances.TryGetValue(variableName, out IVariableInstanceEntity variableInstance);
                if (variableInstance != null)
                {
                    return(variableInstance);
                }

                // Go up the hierarchy
                IVariableScope parentScope = ParentVariableScope;
                if (parentScope != null)
                {
                    return(parentScope.GetVariableInstance(variableName, true));
                }

                return(null);
            }
            else
            {
                if (variableInstances != null && variableInstances.ContainsKey(variableName))
                {
                    return(variableInstances[variableName]);
                }

                IVariableInstanceEntity variable = GetSpecificVariable(variableName);
                if (variable != null)
                {
                    usedVariablesCache[variableName] = variable;
                    return(variable);
                }

                // Go up the hierarchy
                IVariableScope parentScope = ParentVariableScope;
                if (parentScope != null)
                {
                    return(parentScope.GetVariableInstance(variableName, false));
                }

                return(null);
            }
        }