I got myself in a problem with dividing visibility of my lib, I don't want users to see any boilerplate, procs and methods they should not see. ### USER GAME MODULE import actors # engine module ComponentObject* = object x*,y*: int ComponentHealth* = object arg1*, arg2*: int ComponentPlayer* = object damage* : int # ecs.add is a macro ecs.add ComponentObject, Compact ecs.add ComponentPlayer, Compact ecs.add ComponentHealth, Compact # makes a group ecs.group players: scope: public comps: (ComponentPlayer, ComponentObject, ComponentHealth) Run ### ENGINE MODULE # decide what template to use for generating storage for a component macro add*(this: EcsInstance, component: untyped, component_kind: static[RegKind] = RegKind.Fast): untyped = # generating a storage for a component template internal_storagefast*(this: EcsBase, t: typedesc) = template internal_storagecompact*(this: EcsBase, t: typedesc) = Run
So the thing is that I can see _storagefast Run and _storagecompact Run from the game scope. I can't make them private, cause then I can't make them work in the game module from the macro add Run . I made It impossible to work with them ( ? ) by some hacks like this type #@ecs EcsBase = object EcsInstance = object base : EcsBase ecs* = EcsInstance() Run So while I can see an ECS object from the game and hit macro Run I can't get myself touching directly _storagecompact, internal_storagefast Run But It looks and feels bad :) The templates make some boilerplate code and stuff needed to work with components and storage. Any thoughts? : )