docs: def sync(self):
          """
          This is the method that does everything automatically (at least attempts to).
  
          Steps:
              0. Call "before_start" method (which might be implemented by children classes)
              1. Retrieve data from external source
              2. Parse the data
              3. Save the data locally
              4. Call "after_complete" method (which might be implemented by children classes)
          """
          self.before_start()
          self.retrieve_data()
          self.parse()
  
          # TRICK: disable new_nodes_allowed_for_layer validation
          try:
              Node._additional_validation.remove('new_nodes_allowed_for_layer')
          except ValueError as e:
              print "WARNING! got exception: %s" % e
          # avoid sending zillions of notifications
          pause_disconnectable_signals()
  
          self.save()
  
          # Re-enable new_nodes_allowed_for_layer validation
          try:
              Node._additional_validation.insert(0, 'new_nodes_allowed_for_layer')
          except ValueError as e:
              print "WARNING! got exception: %s" % e
          # reconnect signals
          resume_disconnectable_signals()
  
          self.after_complete()
  
          # return message as a list because more than one messages might be returned
          return [self.message]