"""Late-bound base-class (with acceleration)""" from OpenGL import acceleratesupport LateBind = Curry = None if acceleratesupport.ACCELERATE_AVAILABLE: try: from OpenGL_accelerate.latebind import LateBind, Curry except ImportError as err: pass if LateBind is None: class LateBind(object): """Provides a __call__ which dispatches to self._finalCall When called without self._finalCall() makes a call to self.finalise() and then calls self._finalCall() """ _finalCall = None def setFinalCall( self, finalCall ): """Set our finalCall to the callable object given""" self._finalCall = finalCall def getFinalCall( self ): """Retrieve and/or bind and retrieve final call""" if not self._finalCall: self._finalCall = self.finalise() return self._finalCall def finalise( self ): """Finalise our target to our final callable object return final callable """ def __nonzero__(self): """Resolve our final call and check for empty/nonzero on it""" return bool(self.getFinalCall()) def __call__( self, *args, **named ): """Call self._finalCall, calling finalise() first if not already called There's actually *no* reason to unpack and repack the arguments, but unfortunately I don't know of a Cython syntax to specify that. """ try: return self._finalCall( *args, **named ) except (TypeError,AttributeError) as err: if self._finalCall is None: self._finalCall = self.finalise() return self._finalCall( *args, **named ) if Curry is None: class Curry(object): """Provides a simple Curry which can bind (only) the first element This is used by lazywrapper, which explains the weird naming of the two attributes... """ wrapperFunction = None baseFunction = None def __init__( self, wrapperFunction, baseFunction ): """Stores self.wrapperFunction and self.baseFunction""" self.baseFunction = baseFunction self.wrapperFunction = wrapperFunction def __call__( self, *args, **named ): """returns self.wrapperFunction( self.baseFunction, *args, **named )""" return self.wrapperFunction( self.baseFunction, *args, **named )