private Trail handleNoTrueChild(Trail trail) {
    TreeModel treeModel = getModel();

    TreeModel.NoTrueChildStrategy noTrueChildStrategy = treeModel.getNoTrueChildStrategy();
    switch (noTrueChildStrategy) {
      case RETURN_NULL_PREDICTION:
        return trail.selectNull();
      case RETURN_LAST_PREDICTION:
        Node lastPrediction = trail.getLastPrediction();

        // "Return the parent Node only if it specifies a score attribute"
        if (lastPrediction.hasScore()) {
          return trail.selectLastPrediction();
        }
        return trail.selectNull();
      default:
        throw new UnsupportedFeatureException(treeModel, noTrueChildStrategy);
    }
  }
  private Node evaluateTree(Trail trail, EvaluationContext context) {
    TreeModel treeModel = getModel();

    Node root = treeModel.getNode();

    Boolean status = evaluateNode(trail, root, context);

    if (status != null && status.booleanValue()) {
      trail = handleTrue(trail, root, context);

      Node node = trail.getResult();

      // "It is not possible that the scoring process ends in a Node which does not have a score
      // attribute"
      if (node != null && !node.hasScore()) {
        throw new InvalidFeatureException(node);
      }

      return node;
    }

    return null;
  }