An object is polymorphic when its specific type may vary.
The types a specific value may take, is called class.

It is trivial to copy an object if its type is known:

int x;
int y = x;
Here x is not polymorphic, so y is declared of same type (int) as x.
But if the specific type of x were unknown, then y could not be declared of any specific type.

The task: let a polymorphic object contain an instance of some specific type S derived from a type T.
The type T is known.
The type S is possibly unknown until run time.
The objective is to create an exact copy of such polymorphic object (not to create a reference, nor a pointer to).
Let further the type T have a method overridden by S.
This method is to be called on the copy to demonstrate that the specific type of the copy is indeed S.

with javascript_semantics
enum NAME, METHOD

procedure me_t()
    puts(1,"I is a T\n")
end procedure

procedure me_s()
    puts(1,"I is an S\n")
end procedure

type T(object o)
    -- as o[METHOD] can be overidden, don't verify it (as in test for me_t)!
    return sequence(o) and length(o)=2 and string(o[NAME]) and integer(o[METHOD])
end type

type S(T t)
    return t[METHOD] = me_s
end type

S s = {"S",me_s}
T t = {"T",me_t}

call_proc(t[METHOD],{})
t = s
call_proc(t[METHOD],{})
