I like it. First a couple details:

class ClassInfo {
@property:
    string name();
    string baseName();
    string parentName(); // if applicable, null otherwise
    string[] interfaces();
    bool isShared();
    Protection protection();
    DataMemberInfo[] data();
    MethodInfo[] methods();
    Object defaultConstructor();
    ...
}

Why do you not use recursion here? Why not
ClassInfo base();
ClassInfo parent();
and then you get baseName by calling base.name;

Then for an e.g. method declaration we'd have:

class MethodInfo {
@property:
    string name();
    bool isStatic(), isFinal(), isOverride();
    Protection protection();
    string[] parameterTypes();
    string[] parameterNames();
}

Do you think there'll be any way to get the actual types of the arguments and the return type back from the struct? I think that without compiler magic or an uncomfortable amount of templates it probably won't be possible, but I might be wrong.


Now to my big complaint:

I really dislike making the runtime api accessible through a mixin. I'd much prefer making it a non-member template. Reasons are a) I don't want to store the runtime information in my type. A vtable pointer should be enough to get that information. Maybe use it as an index into a global immutable associative array. For modules and non-class types the name can act as a unique identifier. b) It'd make it possible to get runtime information on types that I get from libraries.
c) It would lead to less coupling.
d) It would discourage writing types that rely on runtime reflection, but it would not make it impossible.

Reply via email to