there's a lot of potential duplication in module implementations. it would be solved by adding anew class, portfolio_module_caller_base which implements some of the abstract functions so the subclasses don't have to (eg get_navigation)
this would mean a slight refactor of the two and a half I've done already but might be worth it.