public InviteServiceImpl(
      final StackContext stackContext, final TransactionManager transactionManager) {
    super(stackContext, transactionManager);

    transactionSafeView = TransactionUtils.wrap(this, InviteService.class);

    subscribeToTransactionManager();
  }
  private SteppedAcceptable createSafeInviteAcceptable(final Dialog dialog) {
    return TransactionUtils.wrap(
        new SteppedAcceptable<Dialog>() {

          private final Dialog dlg = dialog;

          public void reject(Dialog parameter, int statusCode, String alternativeUserAddress) {
            if (dialog.isUpdateInProgress()) {
              InviteServiceImpl.this.doRejectUpdate(dlg, statusCode, alternativeUserAddress);
              dialog.unmarkUpdateInProgress();
            } else {
              InviteServiceImpl.this.doReject(dlg, statusCode, alternativeUserAddress);
            }
          }

          public void accept(Dialog parameter) {
            Logger.log(
                "SteppedAcceptable",
                "accept#dialog.isUpdateInProgress() = " + dialog.isUpdateInProgress());

            if (dialog.isUpdateInProgress()) {
              Logger.log("SteppedAcceptable", "doAcceptUpdate");
              InviteServiceImpl.this.doAcceptUpdate(dialog);
              dialog.unmarkUpdateInProgress();
            } else {
              Logger.log("SteppedAcceptable", "doAccept");
              InviteServiceImpl.this.doAccept(dlg);
            }
          }

          public void preAccept() {
            if (!dialog.isUpdateInProgress()) {
              InviteServiceImpl.this.preAccept(dlg);
            } else {
              assert false : "Method not supported";
            }
          }
        },
        SteppedAcceptable.class);
  }