docs: def lock(self):
          """
          Precomputes some parameters to run faster specific methods like
          Surface.classify.
  
          Stores ``self.domain`` and ``self.path``, both very used in
          the shadows simulation, in order to avoid later unnecessary 
          calculations and verifications.
          
          :returns: None
          
          .. warning:: Unnecessary locks can slowdown your code.
          """
          if not self.locked:
              self.path = self.get_path()
              self.domain = self.get_domain()
              self.locked = True