Thanks a lot Adam, this is what I came with:

module main;

import std.stdio;

class MyObject
{
  abstract string[] getPublicMembers();
}

class MyClassBase(T) : MyObject
{
  override string[] getPublicMembers()
  {
    return generatePublicMembers!T();
  }

  string[] generatePublicMembers(T)()
  {
    string[] ret;
    foreach(mem; __traits(derivedMembers, T))
    {
      static if (is(typeof(__traits(getMember, T.init, mem))))
      {
enum prot = __traits(getProtection, __traits(getMember, T.init, mem));
        static if (prot == "public")
        {
          ret ~= mem;
        }
      }
    }
    return ret;
  }
}


class Foo : MyClassBase!Foo
{
  public int x;
  protected int y;
  private int p;
}

class Bar : MyClassBase!Bar
{
  int x, y;
  private int p;
}

int main(string[] argv)
{
  MyObject f = new Foo();
  MyObject b = new Bar();

  auto members = f.getPublicMembers();

  foreach (mem; members)
  {
    writeln(mem);
  }

  return 0;
}

what do you think? A question: can a mixin method be an override or abstract method?

Reply via email to