Gaspard Bucher
9/14/2007 5:55:00 PM
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
>
>