nodes: 0, module; 1, function_definition; 2, function_name:get_type; 3, parameters; 4, block; 5, identifier:self; 6, identifier:name; 7, expression_statement; 8, comment:# XXX FIXME uhm...how to do all the different types of hidden-services?; 9, if_statement; 10, return_statement; 11, comment:"""
          return the type of a config key.
  
          :param: name the key
  
          FIXME can we do something more-clever than this for client
          code to determine what sort of thing a key is?
          """; 12, comparison_operator:name.lower() == 'hiddenservices'; 13, block; 14, call; 15, call; 16, string; 17, return_statement; 18, identifier:type; 19, argument_list; 20, attribute; 21, argument_list; 22, string_content:hiddenservices; 23, identifier:FilesystemOnionService; 24, subscript; 25, identifier:name; 26, identifier:lower; 27, attribute; 28, identifier:name; 29, identifier:self; 30, identifier:parsers
code: def get_type(self, name):
          """
          return the type of a config key.
  
          :param: name the key
  
          FIXME can we do something more-clever than this for client
          code to determine what sort of thing a key is?
          """
  
          # XXX FIXME uhm...how to do all the different types of hidden-services?
          if name.lower() == 'hiddenservices':
              return FilesystemOnionService
          return type(self.parsers[name])