@Override
	public boolean nextGeneration() {
		/*
		 * 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population.
		 * 2. Any live cell with two or three live neighbours lives on to the next generation.
		 * 3. Any live cell with more than three live neighbours dies, as if by overcrowding.
		 * 4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction
		 */

		int neighbours = 0;
		FieldIter<Cell> fieldIter = this.iterator();
		if(fieldIter.isEmpty()) {
			return false;
		}

		while(fieldIter.hasNext()){
			Cell cell = fieldIter.next();
			neighbours = cell.getNeighbour();
			if (cell.isDead()) {
				if (neighbours == 3) {
					setLife(cell);
				}
			} else {
				if (neighbours < 2) {
					setDead(cell);
				} else if (neighbours  > 3) {
					setDead(cell);
				}
			}
		}
		boolean isNewGeneration = updateChanges();
		if (isNewGeneration){
			generation ++;
			return true;
		} else {
			return false;
		}
	}