1(*Stream:class_ctors*)
2let create_$classname_from_ptr raw_ptr =
3  C_obj 
4begin
5  let h = Hashtbl.create 20 in
6    List.iter (fun (nm,fn) -> Hashtbl.replace h nm fn) 
7	[ "nop", (fun args -> C_void) ;
8	  $classbody 
9	 "&", (fun args -> raw_ptr) ;
10       ":parents",
11       (fun args ->
12          C_list
13	  (let out = ref [] in 
14	    Hashtbl.iter (fun x y -> out := (x,y) :: !out) h ;
15          (List.map	
16	     (fun (x,y) ->
17		C_string (String.sub x 2 ((String.length x) - 2)))
18	     (List.filter
19		(fun (x,y) ->
20		   ((String.length x) > 2)
21		   && x.[0] == ':' && x.[1] == ':') !out)))) ;
22       ":classof", (fun args -> C_string "$realname") ;
23       ":methods", (fun args -> 
24	  C_list (let out = ref [] in 
25	    Hashtbl.iter (fun x y -> out := (C_string x) :: !out) h ; !out))
26	] ; 
27	let rec invoke_inner raw_ptr mth arg = 
28	begin
29	  try
30	    let application = Hashtbl.find h mth in
31	      application
32		(match arg with 
33		     C_list l -> (C_list (raw_ptr :: l)) 
34		   | C_void -> (C_list [ raw_ptr ])
35		   | v -> (C_list [ raw_ptr ; v ]))
36	  with Not_found -> 
37		(* Try parent classes *)
38		begin
39		  let parent_classes = [
40		    $baselist
41		  ] in
42		  let rec try_parent plist raw_ptr =
43		    match plist with
44			p :: tl -> 
45			  begin
46			    try
47			      (invoke (p raw_ptr)) mth arg
48			    with (BadMethodName (p,m,s)) -> 
49			      try_parent tl raw_ptr
50			  end
51		      | [] ->
52			  raise (BadMethodName (raw_ptr,mth,"$realname"))
53		  in try_parent parent_classes raw_ptr
54		end
55	end in
56	  (fun mth arg -> invoke_inner raw_ptr mth arg)
57end
58
59let _ = Callback.register 
60          "create_$normalized_from_ptr"
61          create_$classname_from_ptr
62
63
64(*Stream:mli*)
65val create_$classname_from_ptr : c_obj -> c_obj
66
67