class SABRExtrapolationLeftFunction extends SABRExtrapolationLeftRightFunction {

  public double price(final EuropeanVanillaOption option) {
    ArgumentChecker.notNull(option, "option");

    double p = 0.0;
    double k = option.getStrike();

    if (k >= _cutOffStrike) { // Uses Hagan SABR function.
      Function1D<SABRFormulaData, Double> funcSabr = getVolatilityFunction().getVolatilityFunction(option, _forward);
      double volatility = funcSabr.evaluate(_sabrData);
      if (volatility < 0.0) {
        volatility = 0.0;
      }
      BlackFunctionData dataBlack = new BlackFunctionData(_forward, 1.0, volatility);
      Function1D<BlackFunctionData, Double> funcBlack = BLACK_FUNCTION.getPriceFunction(option);
      p = funcBlack.evaluate(dataBlack);
    } else { // Uses extrapolation for put.
      p = extrapolation(k);
      if (option.isCall()) { // Call by call/put parity
        p = p + (_forward - option.getStrike());
      }
    }

    return p;
  }

  public  SABRExtrapolationLeftFunction(final double forward, final SABRFormulaData sabrData, final double cutOffStrike, final double timeToExpiry, final double mu,
      final VolatilityFunctionProvider<SABRFormulaData> volatilityFunction);

}