let rec compile_callbacks callbacks state_name = 
  match callbacks with 
      cur::rest ->
        let field, foo = 
          (match cur with
               SynFsmOnInit s -> "onInit", s 
                    (** Not actually a callback. Called when the state is viisted. *)

             | SynFsmOnMoveRequest s -> "onMoveRequest", s
             | SynFsmOnTeammateDeath s -> "onTeammateDeath", s
             | SynFsmOnBombDetonate s -> "onBombDetonate", s
             | SynFsmOnDeath s -> "onDeath", s)
        in
          (if field = "onInit" then 
               (** Process onInit differently *)

             [ SynVarAssign
                 (SynVarAssignment
                    (SynStructOrEnumValue
                       (SynVarName state_name,
                        "init",
                        ref VIdUnspecified),
                     SynVarIdentifier
                       (SynVarName foo))) ]
           else
             [ SynVarAssign
                 (SynVarAssignment
                    ((SynStructOrEnumValue
                        (SynVarName (concat [state_name;"_callbacks"]),
                         field, ref VIdUnspecified)),
                     (SynVarIdentifier
                        (SynVarName foo)))) ])
          @ compile_callbacks rest state_name
    | [] -> []