Metadatas são declarações usadas em suas classes ActionScript/MXML que podem definir atributos de seus componentes, propriedades “bindable”, eventos, etc. Quem programa em flex já deve conhecer algumas das mais comuns como [Bindable] e [Event], e para quem tem um conhecimento em Java, pode comparar metadatas com annotations.
As tags de metadata são associadas a declarações de classe, um único campo de data ou um método. Para associar uma metadata basta você escrevê-la em uma linha antes de sua propriedade ou método, como por exemplo:
[Bindable]
public var nome:String;
Porém, isso não passa de uma implementação básica. Até o momento só utilizamos metadatas pré-definidas na sdk do Flex, e o que gostariamos mesmo seria criar nossas próprias metadatas, e saber como interpretá-las.
Vamos por passos. O exemplo a seguir mostra a implementação de uma metadata personalizada para atributos de uma classe.
Primeiro passo. Vamos criar nossa classe e definir uma Metadata personalizada em um atributo.
public class MinhaClasse
{
[MinhaTag]
public var nome:String;
public function MinhaClasse()
{
}
}
OBS: O flex 4 já reconhece e compila qualquer metadata automaticamente em qualquer classe. O flex 3 precisa de um parâmetro para reconhecer e compilar as metadatas, no caso da minha classe de exemplo, o parâmetro seria: -keep-as3-metadata+=MinhaTag
Segundo Passo. Precisamos de algum método que nos retorne o nome da propriedade que contenha a minha nova metadata.
public static function getPropertiesByMetadata(metadataName:String, object:Object):Array
{
var values:Array = new Array();
var describe:XML = describeType(object);
for each(var variable:XML in describe.variable)
{
for each(var metadata:XML in variable.*)
{
if(metadata.@name == metadataName)
{
values.push(variable.@name);
}
}
}
return values;
}
Este método, nos retorna uma lista de propriedades do parâmetro object cujo metadata seja identica ao parâmetro metadataName.
Terceiro Passo. Utilizar o método com nossa classe de teste.
[actionScript]
private function teste():void
{
var minhaClasse:MinhaClasse = new MinhaClasse();
minhaClasse.nome = “Bruno Sales”;
var array:Array = Metadata.getPropertiesByMetadata(“MinhaTag”, minhaClasse);
for each(var obj:Object in array)
{
trace(“propriedade: ” + obj + ” – valor: ” + minhaClasse[obj]);
}
}
O resultado do trace deste método seria: “propriedade: nome – valor: Bruno Sales”.
Pronto. Com essa base, você será capaz de implementar metadatas personalizadas de atributos em sua aplicação. Para métodos e classes, fica para uma próxima vez. 🙂
Legal.
Metadatas próprias são ótimas para trabalhar com AOP (Aspect Oriented Programming), mas para isso é bom ter uma boa biblioteca de Reflexão para facilitar acesso a estes dados. Manipular o describeType toda vez q precisar usar Reflexão é um pouco custoso.
Há um tempo, comecei a escrever uma biblioteca assim, mas logo em seguida achei a Spicelib Refletcion Utils: (http://www.spicefactory.org/spicelib/docs/as3/current/manual/?page=reflection§ion=metadata_mapping)
Muito boa, recomendo o uso.
[]’s
[…] Metadatas Personalizadas (Flex 3 e Flex 4) […]