// runnable can take an argument (the mouse event) static A onLeftClick(final A c, fO runnable) { swing { c.addMouseListener(leftClickMouseAdapter(runnable)); } ret c; } // runnable takes no args static TrayIcon onLeftClick(final TrayIcon c, final O runnable) { swing { c.addMouseListener(leftClickMouseAdapter_noPt(runnable)); } ret c; } static A onLeftClick(fO runnable, A c) { ret onLeftClick(c, runnable); } static A onLeftClick(Runnable runnable, A c) { ret onLeftClick(c, runnable); } static A onLeftClick(A c, Runnable r) { ret onLeftClick(r, c); }