better abstract based structure