@Override
	protected ExpressionElement protectedNext() {
		
		switch (this.nextState) {
		
		case LEFT_BRACKET:
			this.nextState = State.LEFT_OPERAND;
			return new OpenBracketExpression();
			
		case LEFT_OPERAND:
			this.nextState = State.OPERATOR;
			Operand firstOperand = operator.getFirstOperand();
			this.innerIterator = firstOperand.inOrderIterator();
			return this.innerIterator.next();
			
		case OPERATOR:
			this.nextState = State.RIGHT_OPERAND;
			return operator.getExpression();
			
		case RIGHT_OPERAND:
			this.nextState = State.RIGHT_BRACKET;
			Operand secondOperand = operator.getSecondOperand();
			this.innerIterator = secondOperand.inOrderIterator();
			return this.innerIterator.next();
			
		case RIGHT_BRACKET:
			this.hasNext = false;
			return new CloseBracketExpression();
			
		default:
			break;
		}
		// this code shall never be reached
		return null;
	}