onMissingMethod for dynamic set and get methods

28 December 2007

ColdFusion 8 introduces this to deal with calls to methods that don't exist. This can be used for a few things but the most interesting of which it dynamic set and get methods to access an objects' properties.

Here for my reference more than anything and shown in a CFC.

Test.cfc:

<cfcomponent>      <cfset VARIABLES.property1 = "">    <cfset VARIABLES.property2 = "">      <cffunction name="onMissingMethod" output="false">          <cfargument name="missingMethodName" type="string" required="true">      <cfargument name="missingMethodArguments" type="struct" required="true">            <cfset var action = Left(ARGUMENTS.missingMethodName, 3)>      <cfset var property = Right(ARGUMENTS.missingMethodName, Len(ARGUMENTS.missingMethodName) - 3)>          <cfif action EQ "get" AND StructKeyExists(VARIABLES, property)>        <cfreturn VARIABLES[property]>      <cfelseif action EQ "set" AND StructKeyExists(VARIABLES, property)>        <cfset VARIABLES[property] = ARGUMENTS.missingMethodArguments[1]>      <cfelse>        <cfthrow type="InvalidMethodNameException" message="The method #ARGUMENTS.missingMethodName# was not found in component<br />#GetCurrentTemplatePath()#">      </cfif>        </cffunction>      <cffunction name="setProperty2">      <cfargument name="property2">      <cfset VARIABLES.property2 = ARGUMENTS.property2>    </cffunction>      <cffunction name="getProperty2">      <cfreturn VARIABLES.property2>    </cffunction>    </cfcomponent>

onMissingMethod checks for 'set' or 'get' at the start of the method name and assumes the rest is a reference to a property in the CFC. If it can't set or get a property, it throws the same error it would have if onMissingMethod wasn't defined.

test.cfm:

<cfset test = CreateObject("component", "test")>    <cfset test.setProperty1("This is set with the onMissingMethod... method")>  <cfset test.setProperty2("This will be set with the setProperty2 method")>    <cfoutput>   <p>#test.getProperty1()#</p>   <p>#test.getProperty2()#</p>  </cfoutput>

The above code shows how you can override the dynamic setters and getters by defining them yourself.