got the ruby-generated type info actually working
diff --git a/aos/build/queues.gypi b/aos/build/queues.gypi
index 7ae0d89..884b173 100644
--- a/aos/build/queues.gypi
+++ b/aos/build/queues.gypi
@@ -118,6 +118,7 @@
   },
   'dependencies': [
     '<(AOS)/common/common.gyp:queues',
+    '<(AOS)/common/common.gyp:once',
   ],
   'export_dependent_settings': [
     '<(AOS)/common/common.gyp:queues',
diff --git a/aos/build/queues/compiler.rb b/aos/build/queues/compiler.rb
index 9c0270f..8c643c7 100644
--- a/aos/build/queues/compiler.rb
+++ b/aos/build/queues/compiler.rb
@@ -102,6 +102,7 @@
 	cpp_tree.add_cc_include("aos/common/byteorder.h".inspect)
 	cpp_tree.add_cc_include("aos/common/inttypes.h".inspect)
 	cpp_tree.add_cc_include("aos/common/queue_types.h".inspect)
+  cpp_tree.add_cc_include("aos/common/once.h".inspect)
 	cpp_tree.add_cc_using("::aos::to_network")
 	cpp_tree.add_cc_using("::aos::to_host")
 	cpp_tree.add_swig_header_include("aos/common/queue.h".inspect)
diff --git a/aos/build/queues/output/message_dec.rb b/aos/build/queues/output/message_dec.rb
index 92e32e5..e5905c2 100644
--- a/aos/build/queues/output/message_dec.rb
+++ b/aos/build/queues/output/message_dec.rb
@@ -6,26 +6,28 @@
 
 class Target::StructBase < Target::Node
 	def create_DoGetType(type_class, cpp_tree)
-		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType* ","DoGetType")
+		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","DoGetType")
 		member_func.static = true
-#		member_func.const = true
 		fields = []
+    register_members = []
 		@members.each do |member|
 			tId = member.getTypeID()
 			fieldName = member.name.inspect
 			if(member.respond_to?(:add_TypeRegister))
-				member.add_TypeRegister(type_class, member_func)
+        register_members.push(member)
 			end
 			fields << "new ::aos::MessageType::Field{#{tId}, #{fieldName}}"
 		end
+    register_members.uniq do |member|
+      member.type
+    end.each do |member|
+			member.add_TypeRegister(cpp_tree, type_class, member_func)
+    end
 		id = getTypeID()
 		member_func.suite << ("static const ::aos::MessageType kMsgMessageType(#{id}, #{@name.inspect}, {" +
 		  "#{fields.join(", ")}})");
 		type_class.add_member(member_func)
-#		val = CPP::StaticVar.new(type_class, "const int", "asdf")
-#		val.args << 0
-#		type_class.add_member(val)
-		member_func.suite << "::type_cache::Add(&kMsgMessageType)"
+		member_func.suite << "::aos::type_cache::Add(kMsgMessageType)"
 		member_func.suite << CPP::Return.new("&kMsgMessageType")
 	end
 	def simpleStr()
@@ -132,10 +134,11 @@
 							"::aos::Message::Size()"))
 	end
 	def create_GetType(type_class, cpp_tree)
-		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType& ","GetType")
-		member_func.const = true
+		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","GetType")
+		type_class.add_member(member_func)
+		member_func.static = true
 		member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
-		member_func.suite << CPP::Return.new("*getter.Get()")
+		member_func.suite << CPP::Return.new("getter.Get()")
 	end
 	def self.builder_loc(loc)
 		return @builder_loc if(@builder_loc)
@@ -278,7 +281,7 @@
 		f_call.args.dont_wrap = true
 	end
 	def getTypeID()
-		Digest::SHA1.hexdigest(@type)[0..7].to_i(16) & 0x4000 #ensures is primative
+		Digest::SHA1.hexdigest(@type)[0..7].to_i(16) | 0x4000 #ensures is primative
 	end
 	def simpleStr()
 		"#{@type} #{@name}"
diff --git a/aos/build/queues/output/q_file.rb b/aos/build/queues/output/q_file.rb
index 1ef47a4..532c6f7 100644
--- a/aos/build/queues/output/q_file.rb
+++ b/aos/build/queues/output/q_file.rb
@@ -155,7 +155,6 @@
 		cons = CPP::Constructor.new(init_class)
 		init_class.add_member(:public,cons)
 		cons.suite << if_stmt = CPP::If.new("0 == #{counter}++")
-		if_stmt.suite << "printf(#{"making a #{@name}!\n".inspect})"
 
 		cons_call = CPP::FuncCall.new("new #{type_name}")
 		cons_call.args.push(@loc.queue_name(@name).inspect)
@@ -165,12 +164,10 @@
 			cons_call.args.push(@loc.queue_name(@name + "." + queue.name).inspect)
 		end
 		if_stmt.suite << CPP::Assign.new("#{@name}_ptr",cons_call)
-		if_stmt.else_suite << CPP::FuncCall.build("printf","already made a #{@name}\n".inspect)
 
 
 		destruct = CPP::Destructor.new(init_class)
 		destruct.suite << if_stmt = CPP::If.new("0 == --#{counter}")
-		if_stmt.suite << "printf(#{"deleting a #{@name}!! :) !!\n".inspect})"
 		if_stmt.suite << "delete #{@name}_ptr"
 		if_stmt.suite << CPP::Assign.new("#{@name}_ptr","NULL")
 
diff --git a/aos/build/queues/output/q_struct.rb b/aos/build/queues/output/q_struct.rb
index 14ba385..868f1f2 100644
--- a/aos/build/queues/output/q_struct.rb
+++ b/aos/build/queues/output/q_struct.rb
@@ -7,20 +7,12 @@
 	def add_member(member)
 		@members << member
 	end
-	def add_TypeRegister(o_type, member_func)
-		type = cpp_tree.get(self)
-		if(@loc == o_type.loc) #use relative name
-			tName = type.name
-		else #use full name
-			tName = @loc.to_cpp_id(type.name)
-		end 
-		member_func.suite << "#{tName}::TypeGet()" 
-	end
 	def create_GetType(type_class, cpp_tree)
-		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType& ","GetType")
+		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","GetType")
+		type_class.add_member(member_func)
 		member_func.static = true
 		member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
-		member_func.suite << CPP::Return.new("*getter.Get()")
+		member_func.suite << CPP::Return.new("getter.Get()")
 	end
 	def create(cpp_tree)
 		return self if(@extern)
@@ -90,6 +82,11 @@
 	def create_usage(cpp_tree)
 		return "#{type_name(cpp_tree)} #{@name}"
 	end
+	def add_TypeRegister(cpp_tree, o_type, member_func)
+		type = cpp_tree.get(@type)
+		tName = @type.loc.to_cpp_id(type.name)
+		member_func.suite << "#{tName}::GetType()"
+	end
 	def fetchPrintArgs(args, parent = "")
 		@type.fetchPrintArgs(args, parent + "#{@name}.")
 	end
diff --git a/aos/build/queues/output/queue_dec.rb b/aos/build/queues/output/queue_dec.rb
index 8c3bd51..6ffe8c5 100644
--- a/aos/build/queues/output/queue_dec.rb
+++ b/aos/build/queues/output/queue_dec.rb
@@ -62,18 +62,15 @@
 		cons = CPP::Constructor.new(init_class)
 		init_class.add_member(:public,cons)
 		cons.suite << if_stmt = CPP::If.new("0 == #{counter}++")
-		if_stmt.suite << "printf(#{"making a #{@name} queue!\n".inspect})"
 
 		cons_call = CPP::FuncCall.new("new #{type_name}")
 		cons_call.args.push(@loc.queue_name(@name).inspect)
 		if_stmt.suite << CPP::Assign.new("#{@name}_ptr",cons_call)
-		if_stmt.else_suite << CPP::FuncCall.build("printf","already made a #{@name}\n".inspect)
 
 
 		destruct = CPP::Destructor.new(init_class)
 		init_class.add_member(:public,destruct)
 		destruct.suite << if_stmt = CPP::If.new("0 == --#{counter}")
-		if_stmt.suite << "printf(#{"deleting a #{@name}!! :) !!\n".inspect})"
 		if_stmt.suite << "delete #{@name}_ptr"
 		if_stmt.suite << CPP::Assign.new("#{@name}_ptr","NULL")
 
diff --git a/aos/common/queue.h b/aos/common/queue.h
index 9f6bc9d..210c61e 100644
--- a/aos/common/queue.h
+++ b/aos/common/queue.h
@@ -49,7 +49,7 @@
   // Writes the contents of the message to the provided buffer.
   size_t Print(char *buffer, int length) const;
 
-  const MessageType *GetType() const;
+  static const MessageType *GetType();
 };
 
 template <class T> class Queue;