}
                public void onJoinThrough(JoinThrough m) {                    Table table = m.getFrom().getTable();                    DML op = m_engine.getOperation(obj, arg, table);                    // This should eliminate duplicates, but we could be                    // smarter by canceling out inserts and updates which                    // we don't do right now.                    if (op != null) { return; }                    boolean one2n = role.isReversable() &&                        !role.getReverse().isCollection();                    if (one2n && e instanceof RemoveEvent) {                        op = m_engine.getOperation(arg, null, table);                    } else {                        op = m_engine.getOperation(arg, obj, table);                    }                    if (op != null) { return; }                    if (e instanceof AddEvent ||                        e instanceof SetEvent &&                        arg != null) {                        op = new Insert(table);                        set(op, m.getFrom(), obj);                        set(op, m.getTo(), arg);                        m_engine.addOperation(obj, arg, op);                    } else if (e instanceof RemoveEvent ||                               e instanceof SetEvent &&                               arg == null) {                        Delete del = new Delete(table, null);                        if (e instanceof SetEvent) {                            filter(del, m.getFrom(), KEY_FROM, obj);                        } else if (one2n) {                            filter(del, m.getTo(), KEY_TO, arg);                        } else {                            filter(del, m.getFrom(), KEY_FROM, obj);                            filter(del, m.getTo(), KEY_TO, arg);                        }                        if (one2n) {                            m_engine.addOperation(arg, null, del);                        } else {                            m_engine.addOperation(obj, arg, del);                        }                    } else {                        throw new IllegalArgumentException                            ("not a set, add, or remove");                    }                }