E não esqueça que vc pode usar o method_missing :-)

Por exemplo:

class LDAPEntry
  attr_accessor :map

  def method_missing(method_id)
    method = method_id.id2name
    if @map[method] # temos uma posicao no hash com essa chave
      @map[method]
    else
      super(method_id)
    end
  end
end

2006/6/8, Joao Pedrosa <[EMAIL PROTECTED]>:
> Oi,
>
>
>
> > - Como posso ter cada classe tendo um LDAP_map diferente, sem ter que
> > necessariamente definir em LDAPEntry#initialize e/ou accessors nas
> > classes "filhas"?
> > - self.send("#{mapped}=", algumacoisa) ficou muito feio, como eu
> > poderia fazer isso de maneira mais decente?
> >
>
>
> Bom, primeira coisa, eu entendo a sua busca por um mapeamento OO,
>  querendo que a classe funcione dessa maneira. Mas na sua busca por
> solução, você já achou uma ou duas alternativas, como usando o
> initialize do objeto.
>
> Se você quer copiar alguma coisa do Rails, então é bastante
> metaprogramação. E metaprogramação é "feia" e mais difícil de acompanhar
> mesmo. Eu mesmo evito usar muita metaprogramação, mas eu uso sim,
> só que dos males o menor, portanto eu evito complicar...
>
>  Pense em alternativas ao uso de @@ (variáveis de classe), porque deve
> simplificar
> mais em Ruby. Se você não puder evitar, então com metaprogramação
> se resolve, usando um Hash para separar os conteúdos de cada classe.
>
> module MyFirstProgram
>
>   class A
>   end
>
>   class B < A
>   end
>
> end
>
> p MyFirstProgram::A.to_s
> p MyFirstProgram::B.to_s
>
> ====== Resultado:
> "MyFirstProgram::A"
> "MyFirstProgram::B"
>
> Agora um exemplo completo que fiz:
>
>
>
> module MyFirstProgram
>
>
>   class LDAPEntry
>
>     @@LDAP_map = {  }
>     def LDAPEntry.ldap_map
>       @@LDAP_map[self] || {}
>     end
>
>
>     def map_fields_from_entry(ldap_entry)
>       for field, mapped in self.class.ldap_map
>
>          self.send("#{mapped}=", ldap_entry[field])
>       end
>     end
>
>   end
>
>
>   class AnyObject < LDAPEntry
>      @@LDAP_map[self] = {"userPassword" => "password" }
>      attr_accessor :password
>   end
>
>
>   class OtherObject < LDAPEntry
>      @@LDAP_map[self] = {"userName" => "username" }
>      attr_accessor :username
>   end
>
> end
>
> sample_entry = { 'userName' => 'James', 'userPassword' => 'Brown' }
>
> p MyFirstProgram::LDAPEntry.ldap_map
> p MyFirstProgram::AnyObject.ldap_map
>  p MyFirstProgram::OtherObject.ldap_map
>
> ao = MyFirstProgram::AnyObject.new
> ao.map_fields_from_entry(sample_entry)
> p ao.password
>
> oo = MyFirstProgram::OtherObject.new
> oo.map_fields_from_entry(sample_entry)
> p oo.username
>
>
> Esse código que usei tem bem pouca metaprogramação, então para mim
> ele ainda é bom. Mas tem código do Rails que vai bem além disso. :-)
>
> Sds,
> Joao
>
>
>
> _______________________________________________
> Ruby-l mailing list
> [email protected]
> http://www.listas.unicamp.br/mailman/listinfo/ruby-l
>
>
>


--
juraci krohling costa
http://jkcosta.info


-- 
juraci krohling costa
http://jkcosta.info
_______________________________________________
Ruby-l mailing list
[email protected]
http://www.listas.unicamp.br/mailman/listinfo/ruby-l

Responder a