public Iterator<Mass> iterator() 
    	{
    		if ( fetchNeighbours) 
    		{
        		return new GridIterator() 
        		{
        	    	private int x = xStart;
        	    	private int y = yStart;
        	    	
        	    	private Mass rightNeighbour;
        	    	private Mass bottomNeighbour;
        	    	
    				@Override
    				public boolean hasNext() 
    				{
    					return x < xEnd && y < yEnd;
    				}

    				@Override
    				public Mass next() 
    				{
    					final Mass result = array[x][y];
    					if ( isAtRightEdge ) {
    						rightNeighbour  = (x+1) < xEnd ? array[x+1][y] : null;
    					} else {
    						rightNeighbour  = array[x+1][y]; // TODO: hackish, another thread my manipulate this Mass instance concurrently...
    					}
    					
    					if ( isAtBottomEdge ) {
    						bottomNeighbour = (y+1) < yEnd ? array[x][y+1] : null;
    					} else {
    						bottomNeighbour = array[x][y+1];
    					}
    					
    					x++;
    					if ( x >= xEnd) {
    						x = xStart;
    						y++;
    					} 
    					return result;
    				}

    				@Override
    				public void remove() { throw new UnsupportedOperationException(); }

    				@Override
    				public Mass rightNeighbour() { return rightNeighbour; }

    				@Override
    				public Mass bottomNeighbour() { return bottomNeighbour; }
        		};    			
    		}
    		return new GridIterator() 
    		{
    	    	private int x = xStart;
    	    	private int y = yStart;
    	    	
				@Override
				public boolean hasNext() 
				{
					return x < xEnd && y < yEnd;
				}

				@Override
				public Mass next() 
				{
					final Mass result = array[x++][y];
					if ( x >= xEnd) {
						x = xStart;
						y++;
					} 
					return result;
				}

				@Override
				public void remove() { throw new UnsupportedOperationException(); }

				@Override
				public Mass rightNeighbour() { throw new UnsupportedOperationException("Wrong iterator type"); }

				@Override
				public Mass bottomNeighbour() { throw new UnsupportedOperationException("Wrong iterator type"); }
    		};
    	}