One of the announced features for ColdFusion 8 is support for dynamically passing attributes to ColdFusion tags. This will be a godsend for tags like CFMAIL. A reader asked me (and by the way, folks, don't ask me about Scorpio, in general I can't answer) if this support carried over to cfmodule and custom tags.
This is actually something that has been supported in ColdFusion for quite some time. I don't have the exact version it was added to ColdFusion, but custom tags have had support for 'attributeCollection' for a while. Consider this simple custom tag:
<cfdump var="#attributes#" label="In the tag">
If you first run it like so:
<cf_customtag name="ray" age="34">
You will see a struct with 2 keys, name and age. However, you can get the same result like so:
<cfset s = structNew()>
<cfset s.name = "ray">
<cfset s.age = 34>
<cf_customtag attributeCollection="#s#">
At the same time, ColdFusion UDFs support an argumentCollection value. Consider this example:
<cffunction name="mirrorargs">
<cfreturn arguments>
</cffunction>
<cfset result = mirrorargs(name='ray',age=34)>
<cfdump var="#result#">
This returns a structure much like the custom tag example. Now imagine we call it like so:
<cfset s = structNew()>
<cfset s.name = "ray">
<cfset s.age = 34>
<cfset result=mirrorargs(argumentCollection=s)>
<cfdump var="#result#" label="Result using argumentcollection">
This will return the same structure as well. (Although to be clear - the case of the structs keys is different, but you should not be relying on struct key case anyway.)
Archived Comments
Obviously what is true for that UDF is also true for a CFC method call. You can pass argumentCollection=Struct to a component call with or without the matching cfargument tags on the other end.
This is also true even if you do not use argumentCollection. You could pass arguments like ("argument1","argument2") and they will come though as an array of unnamed arguments if there are no cfargument tags. Lastly, you could do (argument1="argument1",argument2="argument2") and if there are no matching cfargument tags in the component, you will still get an arguments structure with the named keys.
Whether this is a good practice or not is an entirely seperate argument :)
Sorry that I repeated a little of what you said there, upon rereading I noticed you did cover the named arguments - though it is worth noting that it works on a CFC as well I suppose. This is what I get for speed reading blog posts ;)
To be clear, it isn't an array of unnamed arguments. It is a struct with numerical keys.
To make matters even more confusing, you CAN treat arguments like an array too if you want.
Which you kind of say - but just adding.
@Brain, it may or may not be "good" practice, but it's a very useful one, as the following illustrates:
http://www.cfinternals.org/...