code: def get_layout_objects(self, *LayoutClasses, **kwargs):
          
          index = kwargs.pop('index', None)
          max_level = kwargs.pop('max_level', 0)
          greedy = kwargs.pop('greedy', False)
  
          pointers = []
  
          if index is not None and not isinstance(index, list):
              index = [index]
          elif index is None:
              index = []
  
          for i, layout_object in enumerate(self.fields):
              if isinstance(layout_object, LayoutClasses):
                  if len(LayoutClasses) == 1 and LayoutClasses[0] == string_types:
                      pointers.append([index + [i], layout_object])
                  else:
                      pointers.append([index + [i], layout_object.__class__.__name__.lower()])
  
              # If it's a layout object and we haven't reached the max depth limit or greedy
              # we recursive call
              if hasattr(layout_object, 'get_field_names') and (len(index) < max_level or greedy):
                  new_kwargs = {'index': index + [i], 'max_level': max_level, 'greedy': greedy}
                  pointers = pointers + layout_object.get_layout_objects(*LayoutClasses, **new_kwargs)
  
          return pointers
docs: Returns a list of lists pointing to layout objects of any type matching
          `LayoutClasses`::
  
              [
                  [[0,1,2], 'div'],
                  [[0,3], 'field_name']
              ]
  
          :param max_level: An integer that indicates max level depth to reach when
          traversing a layout.
          :param greedy: Boolean that indicates whether to be greedy. If set, max_level
          is skipped.