added a plugin system for users to extend functionality