ColdBox 3.0.0 Means Simplicity!

News , Tips & Tricks , Walkthroughs Add comments
By: Luis Majano

I am preparing to release the M5 milestone for ColdBox 3.0.0 and I am really amazed at how simple ColdBox 3 is becoming not only in syntax but in principle. I am really excited about this release as it is a push forward in ALL areas of development. Lots of modularity and re-architecture has gone into the core and the results have been amazing. A speed and performance improvement of over 20-30% from 2.6.4 on same code bases have usually been seen and that is without adding the speed of engines like Railo and CF9. Not only that, we have made our motto: simplicity. That is why in this release (M5), you will see that we now have inheritless objects. All objects used within ColdBox are now simple CFCs that are mixed in or decorated at runtime by the engine. Not only that, the engine can discover the family type of the object and choose to decorate it or not. We have even added the ability to override and call virtual methods and thus giving the resemblance of inheritance. Anyways, too much information, but let's look at some cool code now. Event Handler: /**
* Cool simple component with few actions
* @cache true
* @cacheTimeout 45
*/
component{
   
   function index(event){
      var rc = event.getCollection();
      rc.welcome = "Hi There";
      event.setView("simple.index");   
   }
   
   function sayHello(event){
      return "Rendering a simple message baby!";   
   }
   
   function renderHello(event){
      event.renderData(data="<h1>Welcome to my world!</h1>");   
   }
}
Cool! Simple enough, 1 action sets a variable and sets a view for rendering, another view returns a string to be rendered and the third action uses renderdata to marshal data back to the screen. Easy enough hugh? Plugins: Plugins can also be now ANY CFC, no matter where it comes from, ColdBox will use it. Just drop it in the plugins convention folder and use! Also, simple CFCs. /**
* My Awesome printing plugin
* @singleton true
*/
component{
   /**
   * @inject
   */
   property name="dateService";
   function init(){
      setPluginAuthor("Luis Majano");
      setPluginVersion("1.0");
      setPluginDescription("A cool awesome printing module");
      return this;   
   }
   
   function printToday(dateFormat, timeFormat){
      return dateService.getNow(argumentCollection=arguments);   
   }
}
Is that cool or what, no inheritance, cool annotations for persistance and dependency injection. So what about interceptors? The same man, what you think, we just tease you a bit. /**
* My awesome AOP interceptor
*/
component{
   
   /**
   * @eventPattern ^(users?|security|admin)
   */
   function preProcess(event,interceptData){
      getPlugin("Timer").start("Processing-#event.getCurrentEvent()#");
   }
   
   /**
   * @eventPattern ^(users?|security|admin)
   */
   function postProcess(event,interceptData){
      getPlugin("Timer").stop("Processing-#event.getCurrentEvent()#");
   }
   
   /**
   * @interceptionPoint
   */
   function onMyException(event, interceptData){
      // Do Something
   }
   
}
Now this is even more awesome, you can now define an annotation called "eventPattern" which is a regular expression that matches against the incoming event string. If it does, then it calls the interception point, else it ignores it. In this case, I will do AOP timing for events that start with "users,user,security,admin". Not only that you can also create an annotation called "interceptionPoint" and that tells the platform to register this method as a custom observation or interception point. Ok everybody, more interesting posts about 3.0.0 are coming as development continues. Also, we have now almost fully documented all the new features and compatibilities in our new wiki:

Update: For all CF8 code snippets <!--- Handler --->
<cfcomponent output="false" cache="true" cacheTimeout="45">

   <cffunction name="index" output="false">
      <cfargument name="event">
      <cfscript>
         var rc = event.getCollection();
         rc.welcome = "Hi There";
         event.setView("simple.index");   
      </cfscript>
   </cffunction>

   <cffunction name="sayHello" output="false">
      <cfargument name="event">
      <cfreturn "Rendering a simple message baby!">
   </cffunction>

   <cffunction name="renderHello" output="false">
      <cfargument name="event">
      <cfset event.renderData(data="<h1>Welcome to my world!</h1>")>
   </cffunction>


</cfcomponent>


<!--- Plugin --->
<cfcomponent output="false" singleton="true">

   <!--- Dependencies --->
   <cfproperty name="dateService" inject>

   <cffunction name="init" output="false" returnType="any">
      <cfscript>
         setPluginAuthor("Luis Majano");
         setPluginVersion("1.0");
         setPluginDescription("A cool awesome printing module");
         return this;
      </cfscript>
   </cffunction>

   <cffunction name="printToday" returnType="any" output="false">
      <cfargument name="dateFormat">
      <cfargument name="timeFormat">

      <cfreturn dateService.getNow(argumentCollection=arguments)>
   </cffunction>

</cfcomponent>


<!--- Interceptor --->
<cfcomponent output="false">
   
   <cffunction name="preProcess" output="false" eventPattern="^(users?|security|admin)">
      <cfargument name="event">
      <cfargument name="interceptData">
      
      <cfset getPlugin("Timer").start("Processing-#event.getCurrentEvent()#")>
   </cffunction>

   <cffunction name="postProcess" output="false" eventPattern="^(users?|security|admin)">
      <cfargument name="event">
      <cfargument name="interceptData">
      
      <cfset getPlugin("Timer").stop("Processing-#event.getCurrentEvent()#")>
   </cffunction>

   <cffunction name="onMyException" output="false" interceptionPoint="true">
      <cfargument name="event">
      <cfargument name="interceptData">
      
      <!--- Do Something --->
   </cffunction>

</cfcomponent>

4 responses to “ColdBox 3.0.0 Means Simplicity!”

  1. Sami Hoda Says:
    Sweet! Congrats!
  2. dickbob Says:
    Can you write your examples in a CF8 compatible style in future. Not all of us are playing with the cool CF9 kids yet :-)
  3. Curt Gratz Says:
    I can't imagine life without some of the awesomeness in verision 3.0.0. Thanks for all your hard work to make all our lives easier. YTM.
  4. Luis Majano Says:
    @dickbob
    Here are some cf8 goodness for ya!

Leave a Reply