The way I'd do it is to make an interface with a generic call method. The classes themselves fill this out using __traits.

interface SceneObject {
       void _callFunction(string name);
}

mixin template SceneObjectReflection() {
     override void _callFunction(string name) {
foreach(funcname; __traits(derivedMembers, typeof(this))) { static if(funcname[0] != '_') // just to skip stuff like _ctor
                if(funcname == name) {
                    __traits(getMember, this, funcname)();
                    return;
                }
           }
           throw new Exception("no such method");
     }
}

class Person : SceneObject {
    mixin SceneObjectReflection!();
    void greet() { writeln("hello"); }
}




Then you can use it like:

void main() {
   auto obj = cast(SceneObject) Object.factory("test6.Person") ;
   if(obj is null) throw new Exception("no such class");
   obj._callFunction("greet");
}



Where of course the class name and the function name are runtime strings.


It will still be a bumpy ride to make this work in a real world situation, but this is how I would get started.

Reply via email to