The way I envision the Guikachu saver/loader is something like this
(and maybe this could apply to other saver/loader pairs as well):

class IOAdapter
{
public:
	virtual void save (StorageNode       &node) = 0;
	virtual void load (const StorageNode &node) = 0;
}

Then a bunch of IOAdapter subclasses for each resource and widget
type.
It is all tied together with downcasting code like this:


IOAdapter *create_io_adapter (Button *w)
{
	return new ButtonIOAdapter (w);
}

template<class W>
IOAdapter *create_io_adapter_for_widget (Widget *w)
{
	return create_io_adapter (static_cast<W*> (w));
}

