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