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
_______________________________________________
Ruby-l mailing list
[email protected]
http://www.listas.unicamp.br/mailman/listinfo/ruby-l