class Deferrable implements TransactionMode {

        private final boolean not;

        public Deferrable(boolean not) {
            this.not = not;
        }

        @Override
        public String toString() {
            return not ? "NOT DEFERRABLE" : "DEFERRABLE";
        }
    }

    private final List<TransactionMode> transactionModes;

    public SetTransactionStatement(List<TransactionMode> transactionModes) {
        this.transactionModes = transactionModes;
    }

    public List<TransactionMode> transactionModes() {
        return transactionModes;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(transactionModes);
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof SetTransactionStatement
            && ((SetTransactionStatement) obj).transactionModes.equals(this.transactionModes);
    }

    @Override
    public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
        return (R) visitor.visitSetTransaction(this, context);
    }

    @Override
    public String toString() {<FILL_FUNCTION_BODY>

        return "SET TRANSACTION " + Lists.joinOn(", ", transactionModes, TransactionMode::toString);
    
<methods>public non-sealed void <init>() ,public R accept(AstVisitor<R,C>, C) <variables>