I managed to do it :) What i did not say is that the subclasses (with new inst var) i want to use are anonymous subclasses. So i subclassed the SlotClassBuilder and i did: - generate an anonymous subclass from the source class - migrate my object - modify the anonymous subclass with new instance variables - rebuild the class with my own SlotClassBuilder It seems to work. I did not try how to migrate back my object to its original class but i think i might have a problem there. Also it seems very slow. Indeed it is a very certain, specific application :) Steven. Le 2017-06-07 15:32, Blondeau Vincent a écrit :
So, I do not think that is possible...
Any solution I see is either to change the superclass or to add an external object with a mapping between your new objects and the values of your new IVs.
Or you do the migration and after you add the IV once all instances are migrated.
But, I repeat that, as written in comments of primitiveChangeClassTo, "The facility is really provided for certain, very specific applications (mostly related to classes changing shape) and not for casual use."
Vincent
DE : Pharo-users [mailto:pharo-users-bounces@lists.pharo.org] DE LA PART DE Steven Costiou ENVOYÃ : mercredi 7 juin 2017 15:18 Ã : Any question about pharo is welcome OBJET : Re: [Pharo-users] How to migrate an object to a subclass of its class but with new inst vars ?
Hi Vincent, thanks for your quick answer.
This is the default behavior of adoptInstance: which calls primitiveChangeClassTo:
But i specifically want to gain new inst vars, which does not work that way.
I can't add an instvar to the superclass since i don't want to change my system.
Steven.
Le 2017-06-07 15:09, Blondeau Vincent a écrit :
Hi,
You should be able to do it using the method primitiveChangeClassTo: but it not recommended to do it. Are you sure that it is the only way to resolve your problem?
If you really want to, an example:
Object subclass: #Toto
slots: { #tata }
classVariables: { }
category: 'Temp'.
Toto subclass: #Titi
slots: { }
classVariables: { }
category: 'Temp'.
obj := Toto new.
obj primitiveChangeClassTo: Titi new.
obj has a new class.
However, you cannot add a new instance variable this way but you keep the values of the instance.
But nothing avoid you to add an empty instance variable in a superclass that only the subclass will use.
I hope that it will help you
Vincent
DE : Pharo-users [mailto:pharo-users-bounces@lists.pharo.org] DE LA PART DE Steven Costiou ENVOYÃ : mercredi 7 juin 2017 14:54 Ã : Pharo users users OBJET : [Pharo-users] How to migrate an object to a subclass of its class but with new inst vars ?
Hi,
i'm trying to migrate an object from a given class A to a subclass of A with new inst vars. Can't get it to work.
I have a class and an instance of it, say:
Object subclass: #A instanceVariableNames: ''
|a|
a := A new.
A has no instance variables. Now i create a subclass B of A with a new inst var:
A subclass: #B instanceVariableNames: 'x'
I want to do the following:
B adoptInstance: a
It does'nt work, for what i understand it is because the format of the classes are different (B has an inst var and A has not).
How can i make the a object become an instance of B (subclass of a's class), making a acquiring the new inst var x (and in more complex cases keeping its own previous inst vars) ?
Steven.