Certa vez precisei fazer uma validação de métodos existentes em um objeto que eu estava trabalhando no ColdFusion.
Isso era necessário para que assim eu pudesse deixar o script funcionando de forma mais dinâmica, passando qual método requisitar do objeto de forma automática, sem necessidade de um bloco de validações mais complexo.
Inclusive a experiência daquela ocasião serviu como fundamento para eu escrever o artigo sobre Orientação a Objetos no ColdFusion. Caso queira conferir, está NESTE ARTIGO.
Para obter uma lista das cffunctions (métodos) existentes num component (objeto) do ColdFusion, utilizamos a função getmetadata, passando como parâmetro a variável contendo o objeto carregado no script:
<cfset meuComponent = createObject("component", "meu_component")> <cfset metaDataDoComponent = getmetadata(meuComponent)>
O resultado da função getmetadata é uma struct, onde um dos itens dela é FUNCTIONS: um array contendo uma lista de structs que trazem os dados dos métodos desse objeto.
Então, basta percorrer essa struct FUNCTIONS com um cfloop para construir uma lista em um array:
<cfset meuComponent = createObject("component", "meu_component")> <cfset metaDataDoComponent = getmetadata(meuComponent)> <cfset metodosDoComponent = []> <cfloop array="#metaDataDoComponent.functions#" index="function"> <cfset arrayAppend(metodosDoComponent, function.name)> </cfloop>
Na linha 4, fazemos um loop no array FUNCTIONS da struct metaDataDoComponent, e assim, para cada item desse array, fazemos um append no array metodosDoComponent, alimentando-o com os nomes dos métodos;
Apenas para efeito de teste, vamos criar um component fictício chamado meu_component.cfc para testar nosso script:
<cfcomponent> <cffunction name="metodo1"></cffunction> <cffunction name="metodo2"></cffunction> <cffunction name="metodo3"></cffunction> </cfcomponent>
Vamos agora percorrer o array metodosDoComponent com um cfloop para ver em tela os nomes dos métodos:
<cfset meuComponent = createObject("component", "meu_component")> <cfset metaDataDoComponent = getmetadata(meuComponent)> <cfset metodosDoComponent = []> <cfloop array="#metaDataDoComponent.functions#" index="function"> <cfset arrayAppend(metodosDoComponent, function.name)> </cfloop> <cfloop array="#metodosDoComponent#" index="metodo"> <cfoutput>O método é: #metodo#;<br></cfoutput> </cfloop>
Se tudo estiver correto, e o resultado do nosso script será:
O método é: metodo3; O método é: metodo2; O método é: metodo1;
Os métodos serão apresentados em forma decrescente comparado à ordem de instância no meu_component.cfc, porque por algum motivo em particular do ColdFusion, ele próprio registra os métodos na memória de forma decrescente. Isso pode ser constatado dando um cfdump em metaDataDoComponent.functions.