Brandon asks:
Is there a way to see what UDF's are available to the requesting template?
While there is probably some internal method that can do this, there is a little known function you can use to find out if a variable is a UDF. Let's start by creating a bunch of variables and UDFs.
<cfscript>
a = 1;
b = 2;
c = 3;
d = 'you betcha!';
function e() { return 'beer!'; }
f = [1,2,3];
g = {name='Ray',consuming=e};
function h() { return "more beer!"; }
</cfscript>
<cffunction name="i">
<cfreturn "Stuff">
</cffunction>
Yes, those are horrible variable names, but you get the idea. In the above list, e, h, and i are udfs. Everything else is not. So how can we find them? First lets treat the variables scope like a structure:
<cfloop item="k" collection="#variables#">
Next use the isCustomFunction function:
<cfoutput>
The variable #k# is
<cfif not isCustomFunction(variables[k])>NOT</cfif> a UDF.<br />
</cfoutput>
That's it! If you run this you will see that it correctly recognizes which variables are UDFs.
In case you're curious, there isn't a direct way to tell if "X" is a built in function. You can use getFunctionList, which returns a struct, but you would then obviously need to do a structKeyList followed by a listFindNoCase.
I'll admit to have never using either of these functions in production. Has anyone used them?