added plugin system with hot reloading