The name's probably already taken, but what the hell. WarpCore is the name I've given to a very simple implementation of an implicit invocation controller scheme in ColdFusion. The concept is simple: some variable is set that contains an event, the WarpCore handles the registration of new drives (controllers), and the WarpCore controls activating functions in those drives.

Declaring the WarpCore

    url.event = "welcome";

    WarpCore = CreateObject("component", "cfc.warpCore").init(
        trigger: "url.event"

Example Drive

<cfcomponent name="controller1">
    <cffunction name="welcome">
        Welcome from Controller 1<br />
        <cfset setEvent('leave')>
    <cffunction name="bye">
        Good-bye from Controller 1<br />


The WarpCore

<cfcomponent name="warpCore">

    <cffunction name="init" returntype="warpCore" output="false">
        <cfargument name="trigger" type="string" required="false" default="request.func"/>
            variables.core = StructNew();
            variables.trigger = arguments.trigger;
            variables.cap = 10;
            return this;

        function addDrive (sControllerPath) {
            var objController = CreateObject("component", sControllerPath);
            var arrEvents = StructKeyArray(objController);
            var iEvents = ArrayLen(arrEvents);
            var i = 0;
            if (iEvents gt 0) {
                for(i = 1; i lte iEvents; i = i + 1) {
                    if (NOT StructKeyExists(variables.core, arrEvents[i])) {
                        StructInsert(variables.core, arrEvents[i], ArrayNew(1));
                    ArrayAppend(variables.core[arrEvents[i]], objController[arrEvents[i]]);
        function execute() {
            var eCurrent = "";
            var iCount = variables.cap;
            var iEvents = 0;
            var x = 0;
            var executor = "";
            do {
                eCurrent = getEvent();
                if (StructKeyExists(variables.core, eCurrent)) {
                    iEvents = ArrayLen(variables.core[eCurrent]);
                    for (x = 1; x lte iEvents; x = x + 1) {
                        executor = variables.core[eCurrent][x];
                        if (getEvent() neq eCurrent) {
                iCount = iCount - 1;
            } while ((getEvent() neq eCurrent) AND (iCount gte 0));
        function getEvent() {
            return evaluate(variables.trigger);
        function inspect() {
            return variables.core;    
        function setEvent (value) {
            "#variables.trigger#" = arguments.value;


Any way, thats my 2 hour implementation of an II control scheme like those in Mach-II and Model Glue, just without the XML. I know its ugly: I've already got ideas on better ways to handle the setup. The key thing to me is that I want to be able to detect and register event handlers without resorting to predefining them in XML. I love XML, but I just hate needing to write large chunks of code in XML when I can just have the system automatically register the events for me.

Comments are not allowed for this entry.
Jon Hartmann, July 2011

I'm Jon Hartmann and I'm a Javascript fanatic, UX/UI evangelist and former ColdFusion master. I blog about mysterious error messages, user interface design questions, and all things baffling and irksome about programming for the web.

Learn more about me on LinkedIn.