public GameState withEdge(Edge edge, Player player) {
		
		checkNotNull(edge, "edge");
		checkNotNull(player, "player");
		if(!mPlayers.contains(player))
			throw new IllegalArgumentException("player is not part of this " +
					"game: " + player);
		
		// If the edge already exists then we can satisfy the request by simply
		// returning ourself.
		EdgeData edgeData;
		if((edgeData = getEdgeData(edge)) != null) {
			if(edgeData.getOwner().equals(player))
				return this;
			else
				throw new IllegalStateException(String.format("Edge already " +
						"exists with a different owner. edge: %s, owner: %s, " +
						"requested owner: %s", 
						edge, edgeData.getOwner(), player));
		}
		
		// Return a new model with the edge added using our private constructor 
		// for the job.
		return new GameState(this, edge, player);
	}