   func hasOwnProperty(_ o: FObject) -> Bool
   func clearProperty(_ o: FObject)
 }
+extension PropertyInfo {
+  public func f(_ obj: Any?) -> Any? {
+    if let obj = obj as? FObject {
+      return get(obj)
+    }
+    return nil
+  }
+  public func partialEval() {
+    // TODO
+  }
+}
 
 extension PropertyInfo {
   public func toJSON(outputter: Outputter, out: inout String, value: Any?) {

  var sub: Subscription?
}

public protocol PropertyInfo: Axiom, SlotGetterAxiom, SlotSetterAxiom, GetterAxiom, SetterAxiom {
  var classInfo: ClassInfo { get }
  var transient: Bool { get }
  var label: String { get }

    if a === b { return true }
    if a != nil { return a!.isEqual(b) }
    return false
  }
}
public class Reference<T> {
