For reasons I cannot entirely explain, I was trying to call dynamic methods in a cfc in cfscript. (The cfc code was calling a method within itself) I tested a few syntactically wrong ways of getting it done. It the underlying fact that functions are another type of variable in ColdFusion hit me. I should be able to assign dynamic variable to a new variable, and call that as a function. It worked.
functionName = “test”;
args.input = “Yo!”;
tempfunc = variables[functionName];
output = tempfunc(argumentCollection = args);
I feel like someone must have done this before, but could find nothing on it. So I figured I would blog it.
10 thoughts on “Cheap and Easy Dynamic Method Calling in CFScript”
Looks good. I wish that we could do something like this:
variables[ functionName ]();
This works at a “functional” level (as it is what you are essentially doing); but, this fails to compile due to parsing issues.
I agree, Ben, as that method would also work with method calls on other objects too.
I think you’ll find that if you do this with CFC methods, the called function doesn’t correctly bind to VARIABLES or THIS scope…
@Sean, so this method doesn’t really work for calling CFC methods?
Do you mean intra-cfc or external to that CFC?
I know it doesn’t work externally. but it does work intra-cfc. I assume as the variables and this scope are same for the dynamic call.
@Terrence, yeah, you are fine intra-cfc. I do this all the time when I don’t want to escape out of a cfscript block to use cfinvoke.
Either that or when I pass a function to a function, as otherwise, for some reason cf throws a wobbly if you try and call arguments.foo(argumentCollection=args);
Perfect. This is perfect timing. I needed this for a Transfer decorator using onMissingMethod(), and it works great. Thanks!!!
Does not work on persistent objects 😦
It appears I’m late to the party on this one, but I have several methods in a CFC for saving form data. I was trying to create a single action page to call these save functions, but do so dynamically similar to what you’ve done here. I just used cfinvoke method=”#functionName#”. Is there a drawback to doing it this way with cfinvoke? Thanks for the great example!