custom operators: simplified to only require .cmp()