let new_property default =
  let id = Oo.id (object endin
  let v = ref default in
  let set t x =
    Hashtbl.replace t id (fun () -> v := x)
  in
  let get t =
    try
      let x =
        (Hashtbl.find t id) ();
        !v
      in
        v := default;
        x
    with Not_found ->
      default
  in
    (set, get)