/*
		 * Returns all of the Bubbles which are in the immediate neighborhoud of a given location, including the bubble
		 *  in that particular location
		 * Returns null if there is no bubble in the current location
		 * @param {Vector2} location. Location of the matrix that we want to obtain the neighbours of
		 */
		public ArrayList neighbours(Vector2 location){
			int row = (int)location.x;
			int column = (int)location.y;
			
			ArrayList _neigbours = new ArrayList();
			if (row < 0 || row > this._rows -1 || column < 0 || column > this._columns -1)
				throw new System.ArgumentException("Looking for neighbors of an invalid location");	
			
			if (this._bubbleMatrix[row, column] != null){			
				_neigbours.AddNotNull(this._bubbleMatrix[row,column]);
				
				// Left and right neighbours
				if (column > 0) _neigbours.AddNotNull(this._bubbleMatrix[row,column -1]);
				if (column < this._columns-1) _neigbours.AddNotNull(this._bubbleMatrix[row,column+1]);
				
				// higher and lower neighbours
				bool isRowEven = row % 2 == 0;
				if ((isBaselineAlignedLeft && isRowEven) || (!isBaselineAlignedLeft && !isRowEven) ){
					if (row > 0){
							if (column > 0) _neigbours.AddNotNull(this._bubbleMatrix[row-1, column-1]);
							_neigbours.AddNotNull(this._bubbleMatrix[row-1, column]);
						}
						if (row < this._rows -1){
							if (column > 0) _neigbours.AddNotNull(this._bubbleMatrix[row+1, column-1]);
							_neigbours.AddNotNull(this._bubbleMatrix[row +1, column]);
						}
				}
				else{
					if (row > 0){
						_neigbours.AddNotNull(this._bubbleMatrix[row-1, column]);
						if (column < this._columns - 1) _neigbours.AddNotNull(this._bubbleMatrix[row-1, column+1]);
					}
					if (row < this._rows - 1){
						_neigbours.AddNotNull(this._bubbleMatrix[row+1, column]);
						if (column < this._columns - 1) _neigbours.AddNotNull(this._bubbleMatrix[row+1, column+1]);
					}
				}
				return _neigbours;
			}
			return null;
		}