gem state machine