I've been using D (at a primitive level) for a while now at work (a large test-harness that exercises our main code. The harness launches and monitors multiple processes with multiple threads and performs actions on those processes to ensure correct behaviour).
I am wanting to stretch my 'D' wings. I'm having some problems with trying to do the following (reduced case) - and I'm wanting to know if D will even (ever) allow it. Main reason is that I'm porting 'Ash' - a component/entity system written in actionscript, which uses this type of construct. The key issue is that if the line in main() is uncommented - a linker error occurs. Clearly, there is a 'visibility' issue of 'provider' regarding 'TestClass'. However, even if I add 'import main:TestClass' into module 'provider' - (and introduce a compile-time circularity that I absolutely do not want) - it still causes the link error - I guess the necessary information is lost through the IProvider interface. ------------------------------------- module IProvider; public interface IProvider { string providedType(); T createInstance(T)(); } ------------------------------------- module provider; import IProvider; public class Provider(T): IProvider { string providedType() { return T.classinfo.stringof;} public T createInstance(T)() { return new T; } } ------------------------------------- module manager; import provider; import IProvider; public class Manager { private { IProvider[ClassInfo] mProviders; } public void add(T)() { mProviders[T.classinfo] = new Provider!T(); } public IProvider get(T)() { if ( T.classinfo in mProviders ) return mProviders[ T.classinfo ]; else return null; } } ------------------------------------- import manager; import IProvider; import std.stdio; void main() { auto mgr = new Manager(); mgr.add!TestClass(); IProvider provider = mgr.get!TestClass(); writeln("managed type: ", provider.providedType); //auto tmp = provider.createInstance!TestClass(); // Linker error if above line is uncommented } class TestClass { public int value; } -------------------------------------