refactor to use components to let external addons provides other backends