anchor.diff:  
           file.Declarations |> Seq.iter (getTypesWithMembers topLevelTypes)
   
  +        let classAnnotations = Dictionary()
  +        
  +        for t in topLevelTypes do
  +            match t with
  +            | SourceEntity (c, m) ->
  +                collectClassAnnotations classAnnotations sr rootTypeAnnot c m
  +            | _ -> ()
  +
  +        // register all proxies for signature redirection
  +        for (def, annot) in classAnnotations.Values do
  +            match annot.ProxyOf with
  +            | Some p -> comp.AddProxy(def, p)
  +            | _ -> ()
  +
           for t in topLevelTypes do
               match t with
               | SourceMember _ -> failwith "impossible: top level member"
               | InitAction _ -> failwith "impossible: top level init action"
               | SourceEntity (c, m) ->
  -                transformClass sc comp argCurrying sr rootTypeAnnot c m |> Option.iter comp.AddClass
  +                transformClass sc comp argCurrying sr classAnnotations rootTypeAnnot c m |> Option.iter comp.AddClass
               | SourceInterface i ->
                   transformInterface sr rootTypeAnnot i |> Option.iter comp.AddInterface
               
  
positive.code:     let def, proxied =
          match annot.ProxyOf with
          | Some p -> 
              comp.AddProxy(thisDef, p)
              if cls.Accessibility.IsPublic then
                  comp.AddWarning(Some (CodeReader.getRange cls.DeclarationLocation), SourceWarning "Proxy type should not be public")
              let proxied =
  
negative.code:     let methodNames = ResizeArray()
      let def =
          match annot.ProxyOf with
          | Some d -> d
          | _ -> sr.ReadTypeDefinition intf
  
      for m in intf.MembersFunctionsAndValues do
  