I can’t seem to marshal a delegate. The code below:
class Foo < SimpleDelegate
end
Marshal.dump(Foo.new(nil))
Gives me an error:
TypeError: singleton can’t be dumped
The weird thing is that defining _dump or marshal_dump in Foo doesn’t
make this problem go away.
Even stranger is that this error suddenly started showing up in code
that used to work… I’m not sure what may haev changed in the interim
(haven’t touched the code in a few weeks), except I may have apt-get
updated my ruby installation.
After digging around a bit in the delegate source, I fixed the problem
like this:
class MarshalDelegator < SimpleDelegator
alias :make_methods :initialize
def marshal_dump
return @obj
end
def marshal_load(obj)
initialize(obj)
end
end
To marshal, the delegator just dumps the object it is delegating for.
To unmarshal, it loads that object, and sets up the wrapper methods by
calling initialize.