DClick

Metadatas Personalizadas (Flex 3 e Flex 4)


Twitter!

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:

ACTIONSCRIPT:
  1. [Bindable]
  2. 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.

ACTIONSCRIPT:
  1. public class MinhaClasse
  2. {
  3.     [MinhaTag]
  4.     public var nome:String;
  5.  
  6.     public function MinhaClasse()
  7.     {
  8.     }
  9. }

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.

ACTIONSCRIPT:
  1. public static function getPropertiesByMetadata(metadataName:String, object:Object):Array
  2. {
  3.     var values:Array = new Array();
  4.     var describe:XML = describeType(object);
  5.  
  6.     for each(var variable:XML in describe.variable)
  7.     {
  8.         for each(var metadata:XML in variable.*)
  9.         {
  10.             if(metadata.@name == metadataName)
  11.             {
  12.                 values.push(variable.@name);
  13.             }
  14.         }
  15.     }
  16.     return values;
  17. }

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:
  1. private function teste():void
  2. {
  3.  
  4.     var minhaClasse:MinhaClasse = new MinhaClasse();
  5.     minhaClasse.nome = "Bruno Sales";
  6.  
  7.     var array:Array = Metadata.getPropertiesByMetadata("MinhaTag", minhaClasse);
  8.     for each(var obj:Object in array)
  9.     {
  10.         trace("propriedade: " + obj + " - valor: " + minhaClasse[obj]);
  11.     }
  12. }

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. :)

Compartilhe:

  • RSS
  • Twitter
  • del.icio.us
  • Facebook
  • MySpace
  • LinkedIn
  • Google Bookmarks
Por Bruno Sales em 11/June/2009 | Comentar | Trackback


No Translations

Um comentário para “Metadatas Personalizadas (Flex 3 e Flex 4)”


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

Adicionar comentário

(requerido)
(requerido, não será publicado)