# type 'b class_name = .. constraint 'b = < cast : 'a. 'a name -> 'a; .. > and 'a name = Class : 'a class_name -> (< cast : 'a0. 'a0 name -> 'a0; .. > as 'a) name # exception Bad_cast # class type castable = object method cast : 'a name -> 'a end # class type foo_t = object method cast : 'a name -> 'a method foo : string end # type 'b class_name += Foo : foo_t class_name # class foo : foo_t # class type bar_t = object method bar : string method cast : 'a name -> 'a method foo : string end # type 'b class_name += Bar : bar_t class_name # class bar : bar_t # val clist : castable list ref = {contents = []} # val push_castable : #castable -> unit = # val pop_castable : unit -> castable = # - : unit = () # - : unit = () # - : unit = () # val c1 : castable = # val c2 : castable = # val c3 : castable = # val f1 : foo = # val f2 : foo = # val f3 : foo = # Exception: Bad_cast. # val b2 : bar = # Exception: Bad_cast. #