Something that I have been doing quite heavily recently is a registration approach. I.e. in a module constructor (shared) you call a function giving it a class type that most likely inherits another class/interface. From there code is generated/executed at compile time for that function call. Very useful for registering e.g. routes.

However an issue with this approach I've seen while porting glfw to D is that sure this works but how can I do e.g. new Window(640, 480, "My title here"); when it needs to hook into the registration system to grab the real window implementation that you have set to use by default (or overridable by adding the name to the call).

This is essentially the factory pattern.

Now something that allows me to say the function allocates this class but not its children would really be useful. As I could get it to go to the registration system and grab the allocated result from there.

Based upon this what you're thinking of is essentially add/override methods on a class which is really isn't good D code. Too much like c++ and ugly. Perhaps what we could have to accomplish your part while making it obvious is a sorta like how c#'s event support is.

Now we could implement this as a mixin template. I.e. it could generate:

static void method_addHandler(T)(del)
in {
 ... // check if del is a delegate with matching definition
 // first arg must be previous value
} body {
 ... // add arg to list
}

T method(ARGS) {
 ... // run handlers while passing previous value
}

With this you could also pass e.g. a lambda or some delegate to the mixin to say this is my default output of this method. Can also do some checks for default return types ext.

I don't know how to handle access modifiers for this. However pretty much everything else is doable without changing the front end specially for this use case. Will depend though on the allocation api and if it'll allow you to return a child class type. I don't see why it wouldn't though.

But this is just my thoughts on the matter. I'm sure somebody will destroy it!

Reply via email to