@Override
  protected FeatureResult<Boolean> checkInternal(T context, RuntimeEnvironment env) {
    FeatureResult<Boolean> featureResult = null;

    FeatureResult<Double> operand1Result = operand1.check(context, env);
    FeatureResult<Double> operand2Result = operand2.check(context, env);

    if (operand1Result != null && operand2Result != null) {
      boolean result = operand1Result.getOutcome() > operand2Result.getOutcome();
      featureResult = this.generateResult(result);
    }

    return featureResult;
  }
  @Override
  public FeatureResult<Boolean> checkInternal(T context, RuntimeEnvironment env) {
    FeatureResult<Boolean> featureResult = null;

    boolean booleanResult = false;
    for (BooleanFeature<T> booleanFeature : booleanFeatures) {
      FeatureResult<Boolean> result = booleanFeature.check(context, env);
      boolean value = false;
      if (result != null) {
        value = result.getOutcome();
      }
      booleanResult = booleanResult || value;
      if (booleanResult) break;
    }

    featureResult = this.generateResult(booleanResult);
    return featureResult;
  }
  @Override
  protected FeatureResult<String> checkInternal(T context, RuntimeEnvironment env) {
    FeatureResult<String> featureResult = null;

    FeatureResult<Boolean> conditionResult = condition.check(context, env);
    if (conditionResult != null) {
      boolean conditionOutcome = conditionResult.getOutcome();
      if (conditionOutcome) {
        FeatureResult<String> thenFeatureResult = thenFeature.check(context, env);
        if (thenFeatureResult != null) {
          String result = thenFeatureResult.getOutcome();
          featureResult = this.generateResult(result);
        }
      } else {
        FeatureResult<String> elseFeatureResult = elseFeature.check(context, env);
        if (elseFeatureResult != null) {
          String result = elseFeatureResult.getOutcome();
          featureResult = this.generateResult(result);
        }
      }
    }

    return featureResult;
  }