use parametrized module pattern