Thanks for the idea, that's a good workaround. Gaspard 2007/9/14, Joel VanderWerf <vjoel / path.berkeley.edu>: > Gaspard Bucher wrote: > > I need to identify classes from a string called kpath (class path) > > reflecting the class inheritance. The string is made of the first > > letter of each class. This is what I have now: > > Defer building the hash until class_from_path is called. > > One quick and dirty set of changes that does it: > > > class Node > > @@classes = {'N' => self} > > Replace: > > > def self.inherited(child) > > super > > @@classes[child.kpath] = child > > end > > With: > > @@unhandled_children = [] > def self.inherited(child) > super > @@unhandled_children << child > end > > > > > > def self.kpath > > self == Node ? ksel : (superclass.kpath + ksel) > > end > > > > def self.ksel > > self.to_s[0..0] > > end > > > > def self.class_from_kpath(kpath) > > Add: > > while child = @@unhandled_children.pop > @@classes[child.kpath] = child > end > > > @@classes[kpath] > > end > > end > > > > class Page < Node > > end > > > > class Document < Page > > end > > > > class Draft < Page > > def self.ksel > > 'A' > > end > > end > > > > puts Node.class_from_kpath('N') # got 'Node', ok. > > puts Node.class_from_kpath('NPD') # wanted 'Document', got 'Draft' > > puts Node.class_from_kpath('NPA') # wanted 'Draft', got nil > > > > I understand that Draft's ksel method is not known at the time > > Node.inherited is called. > > > > How can I have Node.inherited being called once the complete child > > class is built ? > > > > Thanks for your answers. > > Gaspard > > > -- > vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407 > >