public void attemptToPerformAction(Player actingPlayer, String actionStringKey){
		Action action = playerActionMaps.get(actingPlayer.toString()).get(actionStringKey);
		
		gameHistory += actingPlayer + " attempted " + actionString(action) + ":::";
		for(Player nonEliminatedPlayer : players){
			nameToOutWriter.get(nonEliminatedPlayer.toString()).println(Commands.ShowSelectedAction + "+++" + actionString(action));
		}
		
		CardType cardTypeRequired = action.cardTypeRequired();
		if(cardTypeRequired != null){
			for(Player nonEliminatedPlayer : players){
				if(!nonEliminatedPlayer.equals(actingPlayer)){
					System.out.println("Giving player " + nonEliminatedPlayer.toString() + " the option to call bluff");
					nameToOutWriter.get(nonEliminatedPlayer.toString()).println(Commands.CallBluff.toString() + "+++" + actingPlayer + ":" + cardTypeRequired
							+ ":" + singleTargetedPlayer(action));
					try {
						String response = nameToPlayerInput.get(nonEliminatedPlayer.toString()).readLine();
						Player bluffCaller = nonEliminatedPlayer;
						if(response.equals(Responses.AccuseOfBluff.toString())){
							if(actingPlayer.has(cardTypeRequired)){
								//bluff caller is wrong
								gameHistory += bluffCaller + " incorrectly accused " + actingPlayer + " of bluffing.:::";
								bluffCaller.revealACard("Sorry, you were wrong.  " + actingPlayer + " did have " + cardTypeRequired);
								//TODO need to reveal two if bluff caller is target of assassin?
								game.reshuffleCardAndDrawNewCard(actingPlayer, cardTypeRequired);
								updatePlayerCards();
								checkForBlockingAndThenPerformAction(actingPlayer, action);
							}else{
								if(cardTypeRequired.equals(CardType.assassin)){
									actingPlayer.takeActionAssassin();  //TODO still pay if attempting assassination??
								}
								actingPlayer.revealACard(bluffCaller + " called your bluff about having " + cardTypeRequired);
								gameHistory += bluffCaller + " correctly accussed " + actingPlayer + " of bluffing, thus ending the turn.::::::";
							}
							return;
						}
					} catch (IOException e) {
						throw new RuntimeException("Could not get player input",e);
					}
				}
			}
		}
		
		checkForBlockingAndThenPerformAction(actingPlayer, action);
	}