Improve enum generation for Erlang

Notable changes:
  * Added comment for every enum
  * Introduce type for enum
  * Restrict enum type values to defined by user instead of just by type
diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
index e381110..3ed13c9 100644
--- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
@@ -557,19 +557,37 @@
 void t_erl_generator::generate_enum(t_enum* tenum) {
   vector<t_enum_value*> constants = tenum->get_constants();
   vector<t_enum_value*>::iterator c_iter;
+  vector<string> value_names;
+  vector<string>::iterator names_iter;
 
   v_enums_.push_back(tenum);
   v_enum_names_.push_back(atomify(tenum->get_name()));
 
+  f_types_hrl_file_ << "%% enum " << tenum->get_name() << "\n" << "\n";
+
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
     string name = (*c_iter)->get_name();
-    indent(f_types_hrl_file_) << "-define(" << constify(make_safe_for_module_name(program_name_))
-                              << "_" << constify(tenum->get_name()) << "_" << constify(name) << ", "
-                              << value << ")." << '\n';
+    string define_name = constify(make_safe_for_module_name(program_name_)) + "_" +
+                         constify(tenum->get_name()) + "_" + constify(name);
+    indent(f_types_hrl_file_) << "-define(" << define_name << ", " << value << ")." << '\n';
+    value_names.push_back(define_name);
   }
-
   f_types_hrl_file_ << '\n';
+
+  string enum_definition = "-type " + type_name(tenum) + "() :: ";
+  string value_indent(enum_definition.size(), ' ');
+  f_types_hrl_file_ << enum_definition;
+  bool names_iter_first = false;
+  for (names_iter = value_names.begin(); names_iter != value_names.end(); ++names_iter) {
+    if (names_iter_first) {
+      f_types_hrl_file_ << " |" << "\n" << value_indent;
+    } else {
+      names_iter_first = true;
+    }
+    indent(f_types_hrl_file_) << "?" << *names_iter;
+  }
+  f_types_hrl_file_ << ".\n" << "\n";
 }
 
 void t_erl_generator::generate_enum_info(t_enum* tenum){