code: def parse(self):
          
          try:
              # Continues until `next_line()` raises StopIteration
              # This can trigger here or in parse functions in the subclass
              while True:
                  # Only advance the parser if the previous line was consumed.
                  # Parse functions reading multiple lines can end up reading one line too far,
                  # so they return without consuming the line and we pick it up here
                  if not self.line:
                      self.next_line()
  
                  if self.line[0] == '#' or len(self.values) < 2:
                      self.consume_line()
                      continue
  
                  self.dispatcher.get(self.values[0], self.parse_fallback)()
          except StopIteration:
              pass
  
          if self.auto_post_parse:
              self.post_parse()
docs: Parse all the lines in the obj file
          Determines what type of line we are and dispatch appropriately.