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