abstract state machine