You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
from functools import wraps
 | 
						|
 | 
						|
 | 
						|
class _PluginManager:
 | 
						|
    def __init__(self):
 | 
						|
        self._registered_plugins = []
 | 
						|
        self._cached_base_callbacks = {}
 | 
						|
        self._built_functions = {}
 | 
						|
 | 
						|
    def register(self, *plugins):
 | 
						|
        """
 | 
						|
        Makes it possible to register your plugin.
 | 
						|
        """
 | 
						|
        self._registered_plugins.extend(plugins)
 | 
						|
        self._build_functions()
 | 
						|
 | 
						|
    def decorate(self, name=None):
 | 
						|
        def decorator(callback):
 | 
						|
            @wraps(callback)
 | 
						|
            def wrapper(*args, **kwargs):
 | 
						|
                return built_functions[public_name](*args, **kwargs)
 | 
						|
 | 
						|
            public_name = name or callback.__name__
 | 
						|
 | 
						|
            assert public_name not in self._built_functions
 | 
						|
            built_functions = self._built_functions
 | 
						|
            built_functions[public_name] = callback
 | 
						|
            self._cached_base_callbacks[public_name] = callback
 | 
						|
 | 
						|
            return wrapper
 | 
						|
 | 
						|
        return decorator
 | 
						|
 | 
						|
    def _build_functions(self):
 | 
						|
        for name, callback in self._cached_base_callbacks.items():
 | 
						|
            for plugin in reversed(self._registered_plugins):
 | 
						|
                # Need to reverse so the first plugin is run first.
 | 
						|
                try:
 | 
						|
                    func = getattr(plugin, name)
 | 
						|
                except AttributeError:
 | 
						|
                    pass
 | 
						|
                else:
 | 
						|
                    callback = func(callback)
 | 
						|
            self._built_functions[name] = callback
 | 
						|
 | 
						|
 | 
						|
plugin_manager = _PluginManager()
 |