@Override
	public boolean moveUnit(Position from, Position to) 
	{	
		if(from.equals(to)) return false;
		
		Unit movingUnit = getUnitAt(from);
		
		if(movingUnit == null)
			throw new TriedToMoveNoUnitException();
		
		if(!world.isValidUnitPosition(to)) return false;
		
		//tried to move opposing players unit
		if(movingUnit.getOwner() != getPlayerInTurn())
		{
			return false;
		}
		if(movingUnit.isFortified() == true)
			return false;
		//check move distance
		int moveDistance = Math.max(Math.abs(to.getRow() - from.getRow()), Math.abs(to.getColumn() - from.getColumn()));
		
		if(moveDistance > movingUnit.getMoveCount())
			return false;
		
		if(movingUnit.getMoveCount() >= 1)
		{
			/*
			 * the way the book describes movement makes it sound like a unit with moveCount = 2 can move 2 tiles, but still only move once pr.
			 * turn, even if the unit only moved 1 tile.
			 * -MG
			 */
			((UnitImpl)movingUnit).setMoveCount(0);
		}
		
		Boolean returnValue = false;
		
		Unit targetUnit = getUnitAt(to);
		if(targetUnit != null)
		{
			//moving INTO another unit, check for combat if not owned by same player
			
			if(targetUnit.getOwner() != movingUnit.getOwner())
			{
				//a wild battle appears
				returnValue = handleBattle(from, to);
			}
			else
			{
				//same owner - do nothing
				return false;
			}
		}
		
		City targetCity = getCityAt(to);
		if(targetCity != null){
			returnValue = conquerCityStrategy.conquerCity(movingUnit, targetCity, from, to, world);
		}

		else
		{
			returnValue = handleMove(movingUnit, targetUnit, from, to);
		}
		
		if(returnValue)
		{
			//Move was successful, tell the world to move the unit
			world.moveUnit(movingUnit, from, to);
		}
				
		for(GameObserver o : observers)
		{
			o.worldChangedAt(from);
			o.worldChangedAt(to);
		}
		
		return returnValue;
		
	}