11 jun 2009

Metadatas Personalizadas (Flex 3 e Flex 4)

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:

1
2
[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.

1
2
3
4
5
6
7
8
9
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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. 🙂

Comments

  • Mario Junior
    junho 13, 2009 Responder

    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&section=metadata_mapping)

    Muito boa, recomendo o uso.
    []’s

Leave a Comment