Thanks Richard. You have described it perfectly. This is exactly what I mean. I was reading about $*REPO but like you, I am unable to truly grasp how to get at the information required to make this a reality.
On Sun, Mar 7, 2021 at 7:07 AM Richard Hainsworth <rnhainswo...@gmail.com> wrote: > Interesting question. > > I would like to know a good way of doing this. But just to refine the > question, so that we don't discuss which directory modules are in (doesn't > matter whether its lib/ or bin/), or whether we use classes and > inheritance, the interesting (for me) question is: how to find other > packages that have been installed? > > Assume that we have three distributions, Parent, Brother, Sister. Parent > 'provides' 'Top.rakumod', while brother and sister provide > 'Top::Son.rakumod' and 'Top::daughter.rakumod', respectively. Brother and > Sister have a 'depends': 'Top' in their META6.json. > > Each distribution is in its own git repo. And each are installed by zef. > > Suppose Top is set up as a class with an interface method 'multi method > on-starting { ... }', which each sub-class has to implement, and which when > run, provides the caller with information about the sub-class. > > So, now we run an instance of Top (as defined in Parent). It needs to look > for installed modules that match 'Top::*'. The place to start (I think) is > '$*REPO', which is a linked list of repositories containing the modules > that are installed. $*REPO also does the CompUnit::Repository role, which > in turn has a 'need' method. > > What I don't understand is how to manipulate $*REPO to get a list of all > the candidate modules that match 'Top::*', along the whole of the linked > list. > > Once I have the list of candidates, I can use '^can' to check it has a > 'on-starting' method, and then call that method. > > If someone could provide a bit of boiler plate code, I would really > appreciate it. > > Richard > On 07/03/2021 02:36, Paul Procacci wrote: > > Hey Gents, > > I was toying with an idea of writing a program (shocker!) and in the > design of said program I wanted to give the ability to other module writers > to extend functionality of the base program. > > The main program would live in bin/ as per normal and claim a namespace of > its own. Call it: SuperDuperProgram > > Within this namespace, I would ideally designate > SuperDuperProgram::Modules to be the namespace that modules would live > under. These modules would have their own git repos and depend on > SuperDuperProgram being installed. > > Given this, I'd like the main program to perform a prefix search of > installed modules with that namespace as a prefix, load said modules it > finds, perform callbacks that I would designate as being required to > successfully load the module, etc. > > I've read various resources which include the zef source code, the raku > docs, etc., yet am still unable to wrap my head around this. > > Any pointers in the right direction as welcomed. > > A mock up of what I had in mind: > > ./bin/SuperDuperProgram > ############################### > #!/usr/bin/env raku > > my @modules_with_prefix = > search_installed_modules_with_prefix('SuperDuperProgram::Modules'); > > for @modules_with_prefix { > # require module > # perform init callbacks - new() for example > # whatever else > } > > -- > __________________ > > :(){ :|:& };: > > -- __________________ :(){ :|:& };: