ColdFusionメソッドの動的な実行。

先日のエントリのコードをもうちょっといじってみました。

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
	<cfoutput>
		<head>
			<meta http-equiv="Content-Style-Type" content="text/css"/>
			<title>GetMetaData</title>
		</head>
		<body>
			<cfset VARIABLES.obj=CreateObject("component", "examples.metadata1.TestModule1") />
			<cfset VARIABLES.ret=VARIABLES.obj.add(1, 2) />
			Answer-1:[#VARIABLES.ret#]
			<hr />
			<cfset VARIABLES.methodList=StructKeyList(VARIABLES.obj) />
			<cfloop index="VARIABLES.idx" list="#VARIABLES.methodList#">
				<cfset VARIABLES.method=VARIABLES.obj[VARIABLES.idx] />
				<cfset VARIABLES.ret=VARIABLES.method(2,3) />
				Answer-2:[#VARIABLES.ret#]
			</cfloop>
			<hr />
			<cfset VARIABLES.in=ArrayNew(1) />
			<cfset ArrayAppend(VARIABLES.in, 3) />
			<cfset ArrayAppend(VARIABLES.in, 4) />
			<cfset VARIABLES.ret=invokeMethod("examples.metadata1.TestModule1", "add", VARIABLES.in) />
			Answer-3:[#VARIABLES.ret#]
		</body>
	</cfoutput>
</html>
<cffunction name="invokeMethod" access="private" output="false" returntype="numeric">
	<cfargument name="componentName" type="string" required="true" />
	<cfargument name="methodName" type="string" required="true" />
	<cfargument name="param" type="array" required="true" />
	<cfset var obj=CreateObject("component", ARGUMENTS.componentName) />
	<cfset var method=obj[ARGUMENTS.methodName] />
	<cfset var ret=0 />
	<cfset var idx="" />
	<cfinvoke component="#ARGUMENTS.componentName#" method="#ARGUMENTS.methodName#" returnvariable="ret">
		<cfloop index="idx" from="1" to="#ArrayLen(method.metadata.parameters)#">
			<cfinvokeargument name="#method.metadata.parameters[idx].name#" value="#ARGUMENTS.param[idx]#" />
		</cfloop>
	</cfinvoke>
	<cfreturn ret />
</cffunction>

結果は

Answer-1:[3]
Answer-2:[5]
Answer-3:[7]

おおー動いた!
ColdFusionもなかなかやるもんですね!