docs: public double getValueAsPrice(double evaluationTime, AnalyticModel model) {
  		ForwardCurve	forwardCurve	= model.getForwardCurve(forwardCurveName);
  		DiscountCurve	discountCurve	= model.getDiscountCurve(discountCurveName);
  
  		DiscountCurve	discountCurveForForward = null;
  		if(forwardCurve == null && forwardCurveName != null && forwardCurveName.length() > 0) {
  			// User might like to get forward from discount curve.
  			discountCurveForForward	= model.getDiscountCurve(forwardCurveName);
  
  			if(discountCurveForForward == null) {
  				// User specified a name for the forward curve, but no curve was found.
  				throw new IllegalArgumentException("No curve of the name " + forwardCurveName + " was found in the model.");
  			}
  		}
  
  		double value = 0.0;
  		for(int periodIndex=0; periodIndex<schedule.getNumberOfPeriods(); periodIndex++) {
  			double fixingDate	= schedule.getFixing(periodIndex);
  			double paymentDate	= schedule.getPayment(periodIndex);
  			double periodLength	= schedule.getPeriodLength(periodIndex);
  
  			/*
  			 * We do not count empty periods.
  			 * Since empty periods are an indication for a ill-specified product,
  			 * it might be reasonable to throw an illegal argument exception instead.
  			 */
  			if(periodLength == 0) {
  				continue;
  			}
  
  			double forward = 0.0;
  			if(forwardCurve != null) {
  				forward			+= forwardCurve.getForward(model, fixingDate, paymentDate-fixingDate);
  			}
  			else if(discountCurveForForward != null) {
  				/*
  				 * Classical single curve case: using a discount curve as a forward curve.
  				 * This is only implemented for demonstration purposes (an exception would also be appropriate :-)
  				 */
  				if(fixingDate != paymentDate) {
  					forward			+= (discountCurveForForward.getDiscountFactor(fixingDate) / discountCurveForForward.getDiscountFactor(paymentDate) - 1.0) / (paymentDate-fixingDate);
  				}
  			}
  
  			double discountFactor	= paymentDate > evaluationTime ? discountCurve.getDiscountFactor(model, paymentDate) : 0.0;
  			double payoffUnit = discountFactor * periodLength;
  
  			double effektiveStrike = strike;
  			if(isStrikeMoneyness) {
  				effektiveStrike += getATMForward(model, true);
  			}
  
  			VolatilitySurface volatilitySurface	= model.getVolatilitySurface(volatiltiySufaceName);
  			if(volatilitySurface == null) {
  				throw new IllegalArgumentException("Volatility surface not found in model: " + volatiltiySufaceName);
  			}
  			if(volatilitySurface.getQuotingConvention() == QuotingConvention.VOLATILITYLOGNORMAL) {
  				double volatility = volatilitySurface.getValue(model, fixingDate, effektiveStrike, VolatilitySurface.QuotingConvention.VOLATILITYLOGNORMAL);
  				value += AnalyticFormulas.blackScholesGeneralizedOptionValue(forward, volatility, fixingDate, effektiveStrike, payoffUnit);
  			}
  			else {
  				// Default to normal volatility as quoting convention
  				double volatility = volatilitySurface.getValue(model, fixingDate, effektiveStrike, VolatilitySurface.QuotingConvention.VOLATILITYNORMAL);
  				value += AnalyticFormulas.bachelierOptionValue(forward, volatility, fixingDate, effektiveStrike, payoffUnit);
  			}
  		}
  
  		return value / discountCurve.getDiscountFactor(model, evaluationTime);
  	}