@Override
  public Set<ValueRequirement> getRequirements(
      final FunctionCompilationContext context,
      final ComputationTarget target,
      final ValueRequirement desiredValue) {
    final Set<ValueRequirement> requirements = new HashSet<>();
    final ValueProperties constraints = desiredValue.getConstraints();

    // curve
    final String curveName = constraints.getStrictValue(ValuePropertyNames.CURVE);
    if (curveName == null) {
      return null;
    }

    // interpolator
    final String interpolatorName =
        constraints.getStrictValue(
            ForwardCurveValuePropertyNames.PROPERTY_FORWARD_CURVE_INTERPOLATOR);
    if (interpolatorName == null) {
      return null;
    }

    // interpolator left extrapolator
    final String leftExtrapolatorName =
        constraints.getStrictValue(
            ForwardCurveValuePropertyNames.PROPERTY_FORWARD_CURVE_LEFT_EXTRAPOLATOR);
    if (leftExtrapolatorName == null) {
      return null;
    }

    // interpolator right extrapolator
    final String rightExtrapolatorName =
        constraints.getStrictValue(
            ForwardCurveValuePropertyNames.PROPERTY_FORWARD_CURVE_RIGHT_EXTRAPOLATOR);
    if (rightExtrapolatorName == null) {
      return null;
    }

    final ValueProperties futureCurveProperties =
        ValueProperties.builder()
            .with(
                InstrumentTypeProperties.PROPERTY_SURFACE_INSTRUMENT_TYPE,
                InstrumentTypeProperties.EQUITY_FUTURE_PRICE)
            .with(ValuePropertyNames.CURVE, curveName)
            .get();

    requirements.add(
        new ValueRequirement(
            ValueRequirementNames.FUTURE_PRICE_CURVE_DATA,
            target.toSpecification(),
            futureCurveProperties));
    return requirements;
  }