I'd change around the abstraction here given that the options above don't belong. The difference between run and install at that point is negligible.

Consider a model where there's a method for get_units(**kwargs) and get_options(**kwargs). The defaults can be the inner function/map above and simply returning {} respectively. Then have install call into those.

The act of calling install in the bindings is the same. The subclasses are going to want to stick their foot in when it comes to creating the units to install and adding in custom options.