public void roll(PinCount knockOverCount) throws Exception {
		if (status == FrameStatus.FINISHED) {
			throw new AlreadyFrameFinishedException();
		}

		Integer knockOverPinCount = knockOverCount.intValue();
		if (score + knockOverPinCount > IConstants.PIN_PER_FRAME) {
			if (!isFinalFrame()) {
				throw new PinCountRangeException();
			}
		}

		switch (rollStatus) {
		case ROLL_NEVER:
			ball[0] = knockOverPinCount;
			rollStatus = RollStatus.ROLL_ONCE;
			break;
		case ROLL_ONCE:
			ball[1] = knockOverPinCount;
			rollStatus = RollStatus.ROLL_TWICE;
			break;
		case ROLL_TWICE:
			ball[2] = knockOverPinCount;
			rollStatus = RollStatus.ROLL_THIRD;
			break;
		case ROLL_THIRD:
			throw new Exception();
		}

		score += knockOverPinCount;
		refreshStatus();
	}