public void SetPayment(Payment payment) { if (OrderHasBeenPaidFor()) { throw new OrderAlreadyPaidForException(GetDetailsOnExisitingPayment()); } if (OrderTotalMatches(payment)) { _payment = payment; } else { throw new PaymentAmountDoesNotEqualOrderTotalException(GetDetailsOnIssueWith(payment)); } _state.Submit(this); }