/// <summary>
    /// Takes an expression tree and finds and evaluates all its evaluatable subtrees.
    /// </summary>
    public static Expression EvaluateIndependentSubtrees (Expression expressionTree, IEvaluatableExpressionFilter evaluatableExpressionFilter)
    {
      ArgumentUtility.CheckNotNull ("expressionTree", expressionTree);
      ArgumentUtility.CheckNotNull ("evaluatableExpressionFilter", evaluatableExpressionFilter);

      var partialEvaluationInfo = EvaluatableTreeFindingExpressionVisitor.Analyze (expressionTree, evaluatableExpressionFilter);

      var visitor = new PartialEvaluatingExpressionVisitor (partialEvaluationInfo, evaluatableExpressionFilter);
      return visitor.Visit (expressionTree);
    }