http://d.puremagic.com/issues/show_bug.cgi?id=2484





--- Comment #3 from Justin <mrjn...@gmail.com>  2009-07-01 11:31:25 PDT ---
Ok, with a bit of work, I thing I've improved on this technique a bit.
Here's factory.d:

module factory;

import std.stdio;
import container;

void main() {    
    auto foo = new Container!(int)();
    foo.thingy = 3;
    assert(foo.thingy == 3);
    writefln("foo Classinfo.name : ", foo.classinfo.name);

    auto bar = Object.factory(foo.classinfo.name);
    assert(bar !is null);
    writefln("bar Classinfo.name : ", bar.classinfo.name);
}

And container.d uses a template to insert the patching work:
module container;

import std.moduleinit;

const char[] CURRENT_MODULE = "container";

class Container(T) { 
    T thingy; 

    mixin registerTemplatedClass;
}

public template registerTemplatedClass() {
    static this() {
        // Patch ModuleInfo
        foreach (mod; ModuleInfo.modules)
        {
            if (mod.name == CURRENT_MODULE)
            {
                mod.localClasses ~= [this.classinfo];
                break;
            }
        }
    }
}

This could be improved if there's a way of getting the current module; I
couldn't find anything, so I created the constant CURRENT_MODULE which will
have to be placed in each module which uses the template.

Output is the expected:
foo Classinfo.name : container.Container!(int).Container
bar Classinfo.name : container.Container!(int).Container

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to