the choice can be made either at runtime or by module