I know the op is in the key, but the optimizer may also call __eq__ and the fields won't be set there.  So we need to make sure the info is there before the call to make_thunk(), which is why I insist on using the constructor.

Apart from this disagreement, I feel the rest is ok.