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
}

--
__________________

:(){ :|:& };:

Reply via email to