class GObject::GObject

we have a number of things we need to inherit in different ways:

the solution is to split the class into four areas which we treat differently: