Nitpick alert: I would throw BadState before InvalidArgument.