"Danny Sofer" <danny / sofer.com> wrote
> Here's the synopsis:
>
<snip>
Thanks for the responses. they were very helpful. there follows an amended
code snippet.
'Storage' can be used with any class that includes and extends it. the only
requirement is that there be a publically readable instance variable called
f, that is the first argument of any call to 'new'.
ObjectSpace.each_object is used to pick up the object and save it before it
gets destroyed. this seems a bit of a kludge, but it's the only way i could
work out to reference the object. is there a better way?
module Storage
def new(f, *args)
ObjectSpace.define_finalizer(self, proc {finalizer(f)} )
if File.exists?(f)
File.open(f) {|fl| return Marshal.load(fl) }
else
super
end
end
def finalizer(f)
ObjectSpace.each_object(Storage) do |s|
puts s.inspect
if s.f == f then File.open(f, "w") {|fl| Marshal.dump(s, fl)} end
end
end
end
class Obj
include Storage # mix in Storage
extend Storage # make class methods (i.e. new) available
attr_reader :f
def initialize(f, m='')
@f = f
@m = m
end
end
o = Obj.new('.test', 'hello' )
thanks again for your time and bandwidth.
danny