added interfaces and using decorator accept state