I am currently trying to implement a direct product function for finitely presented groups by wrapping GAP's DirectProduct method. I have placed a constructor direct_product_groups, which appears in the global namespace, in the top level groups.pyx file, which accepts a list of groups as input. The function then checks the representations of the groups listed, and calls the appropriate constructor such as direct_product_permgroups or direct_product_fpgroups, which I am currently implementing as a private constructor.
My goal for direct_product_groups is that it will eventually completely mimic GAP's DirectProduct in that it takes a list of groups in any representation, and outputs their direct product in an appropriate representation. But for now, it behaves simply by punting its input to other, more specific constructors.