Andrei,

I don't see why you couldn't see through it, unless you weren't expanding the 
mixin.

The component factory pulls it blueprints from a directory path created by the
mixin.  This path is imported in the namespace of the factory, thus limiting the
factory to creating components from a specific set of blueprints.

Even though I haven't really cleaned up the code for an "embarrassment-free"
release, here is the specific class:

// creates a runtime component factory from "blueprint.all"
// creates a catalog hash of the module's classinfo also (better way of doing 
this?)

// mixin template
template ComponentFactory(char[] blueprint)
{
        const char[] ComponentFactory = `

                class `~blueprint~`Factory
                {
                        import dendrite.component.` ~ blueprint ~ `.all;
                        HashMap!(char[],ClassInfo) catalog;
                        this(char[] blueprint="` ~ blueprint ~ `")
                        {
                                catalog = new HashMap!(char[],ClassInfo);
                                auto minfo = new ModuleInfo();
                                foreach (mod; minfo)
                                {
                                        if (mod.name == blueprint) {
                                                debug (1) Stdout("creating 
component catalog:").newline;
                                                foreach (classInfo; 
mod.localClasses)
                                                {
                                                        catalog[classInfo.name] 
= classInfo;
                                                        debug (1) Stdout("  
")(classInfo.name).newline;
                                                }
                                        }
                                }
                        }

                        Component createComponent(char[] name)
                        {
                                debug (2) Stdout("creating component: 
")(name).newline;
                                return cast(Component)catalog[name].create();
                        }
                }
        `;
}

// in-line declaration

mixin(ComponentFactory!("Minimal"));

// usage

// create the factory

factory = new MinimalFactory();

// use it to create a component

auto intGenerator = factory.createComponent("IntStreamer");

// attach it to the simulation backplane

backplane.activate(intGenerator);

Reply via email to