add a better version support and add useful methods