code: def load_drops(self, dropin):
          
          obj = load_object(dropin)
          try:
              drops = getattr(obj, self.drops_type)
          except AttributeError:
              try:
                  drops = load_object('%s.%s' % (dropin, self.drops_type))
              except ImportError:
                  drops = None
          if hasattr(drops, '__drops__'):
              drops = drops.__drops__
          if callable(drops):
              drops = drops(self.app)
          return drops or []
docs: Load `drops` from the given dropin.
  
          Args:
              dropin (string): path of a dropin, e.g. dropin.auth
  
          Returns:
              An iterable contains the drops object in the given dropin
  
          This method load drops object by some sort of convension. For example, assuming
          we want to load drops type `models` from dropin `dropin.articls`. The drops are
          discoveried with the following sequence::
  
              import dropin.articles
              drops = dropin.articles.models
  
          if anything goes wrong, next try is ::
  
              import dropin.articles.models as drops
  
          if the current drops object has attribute **__drops__** ::
  
              drops = drops.__drops__
  
          if the current drops object is a callable ::
  
              drops = drops()
  
          if not drops was found, an empty list is returned.