Generator for alternative erl bindings, as well as a few more changes to lib code.

- Exceptions don't work yet, but it looks like everything else does.
- Seems to work fine on our pricing service
- Code could need some cleanup


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@666377 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/alterl/src/thrift_protocol.erl b/lib/alterl/src/thrift_protocol.erl
index 75c2d4b..c94fde1 100644
--- a/lib/alterl/src/thrift_protocol.erl
+++ b/lib/alterl/src/thrift_protocol.erl
@@ -75,6 +75,14 @@
             end || Index <- lists:seq(1, length(Structure))],
     {ok, list_to_tuple(List)};
 
+read(IProto, {struct, {Module, StructureName}}) when is_atom(Module),
+                                                     is_atom(StructureName) ->
+    case read(IProto, Module:struct_info(StructureName)) of
+        {ok, StructureElems} ->
+            {ok, list_to_tuple([StructureName | tuple_to_list(StructureElems)])};
+        Else -> Else
+    end;
+
 read(IProto, {list, Type}) ->
     #protocol_list_begin{etype = EType, size = Size} =
         read(IProto, list_begin),
@@ -217,12 +225,21 @@
 %% Description: 
 %%--------------------------------------------------------------------
 write(Proto, {{struct, StructDef}, Data})
-  when is_list(StructDef), is_tuple(Data), length(StructDef) == size(Data) ->
-    ok = write(Proto, #protocol_struct_begin{}),
-    ok = struct_write_loop(Proto, StructDef, tuple_to_list(Data)),
+  when is_list(StructDef), is_tuple(Data), length(StructDef) == size(Data) - 1 ->
+
+    [StructName | Elems] = tuple_to_list(Data),
+    ok = write(Proto, #protocol_struct_begin{name = StructName}),
+    ok = struct_write_loop(Proto, StructDef, Elems),
     ok = write(Proto, struct_end),
     ok;
 
+write(Proto, {{struct, {Module, StructureName}}, Data})
+  when is_atom(Module),
+       is_atom(StructureName),
+       element(1, Data) =:= StructureName ->
+    StructType = Module:struct_info(StructureName),
+    write(Proto, {Module:struct_info(StructureName), Data});
+
 write(Proto, {{list, Type}, Data})
   when is_list(Data) ->
     ok = write(Proto,