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
> }
>
> --
> __________________
>
> :(){ :|:& };:
>
>

-- 
__________________

:(){ :|:& };:

Reply via email to