start()
* -----------------------------
* | |
* | init() |
* NEW ->-- INITIALIZING |
* | | | | ------------------<-----------------------
* | | |auto | | |
* | | |/ start() |/ |/ auto auto stop() |
* | | INITIALIZED -->-- STARTING_PREP -->- STARTING -->- STARTED -->--- |
* | | | | | |
* | | | | | |
* | | | | | |
* | |destroy()| | | |
* | -->-----<-- auto auto | | |
* | | ---------<----- MUST_STOP ---------------------<-- | |
* | | | | |
* | |/ ---------------------------<-------------------------------- ^
* | | | |
* | | |/ auto auto start() |
* | | STOPPING_PREP ------>----- STOPPING ------>----- STOPPED ---->------
* | | ^ | | ^
* | | stop() | | | |
* | | -------------------------- | | |
* | | | auto | | |
* | | | MUST_DESTROY------<------- | |
* | | | | | |
* | | | |auto | |
* | | | destroy() |/ destroy() | |
* | | FAILED ---->------ DESTROYING ---<----------------- |
* | | ^ | |
* | | destroy() | |auto |
* | -------->----------------- |/ |
* | DESTROYED |
* | |
* | stop() |
* --->------------------------------>------------------------------