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.