As I said before, not much state transition logic can be refactor. They are coupled with the result of external code. One reason it looks a liitle messy is that we always need to use xxx.with to get the reference. In fact, not really much business code.
Another small change is that I add the log structure. It stores at most 1k logs. I think it may help in debugging.
xxx.with
to get the reference. In fact, not really much business code.