Alex Gutteridge wrote: > The problem I have is that sometimes I have extra data associated with > the Atom and/or Residue objects. This extra data always comes later > (from a different data file) and usually won't be present. when I need > to, I'd like to add this data to the (already created data structure) > with the minimum amount of work/fuss. > > As far as I can see I have the following options: > > 1. Modify the Atom and Residue classes to include the extra data, set > to nil originally and then filled in when needed. I'd rather not do > this because the code is part of a bigger project which I don't have > direct control over, and it seems rather inelegant to have these extra > fields which hardly ever get used. > > 2. Create a new AtomExtra class which inherits from Atom but adds > instance variables and accessors for the new data. Then when I read > the extra data I transform each Atom object into an AtomExtra object > and add the new data. I guess the crux of my question is what's the > neatest, Rubyist way of doing this: Is there a smart way of 'morphing' > an object into another type of object (Atom to AtomExtra in this case) > or do I have to create a new object, copy all the data across and then > reattach the new object into the container structure. > > Thanks in advance for any advice or help you can give! # 3. Create a ExtraAtomFunctionality module that you # extend your Atom objects with dynamically. class Atom #... end module ExtraAtomFunctionality attr_accessor :my_extra_stuff end a = Atom.new # ...then later when you find you need to augment the object... a.extend ExtraAtomFunctionality a.my_extra_stuff = "Rogue electron" # It may eat more memory than your other suggestions, # since it would make singleton classes for each # augmented Atom instance. -- (\[ Kent Dahl ]/)_ _~_ _____[ http://www.pvv.org/~kentda/ ]_____/~ ))\_student_/(( \__d L b__/ Master of Science in Technology ) ( \__\_õüõß/__/ ) _) Industrial economics and technology management ( \____/_öß\____/ (____engineering.discipline_=_Computer::Technology___)