(Rule of thumb: whenever you find yourself throwing exceptions like "I know I said I'm an X but I don't do the thing Y that Xs normally do", you should not be declaring yourself to be an X. E.g. you had to do this in with_gate.)