"""Simple plug-in mechanism to provide replacement for setuptools plugins"""

class Plugin( object ):
	"""Base class for plugins to be loaded"""
	loaded = False
	def __init__( self, name, import_path, check = None ):
		"""Register the plug-in"""
		self.name = name 
		self.import_path = import_path
		self.check = check
		self.registry.append( self )
	def load( self ):
		"""Attempt to load and return our entry point"""
		return importByName( self.import_path )
	@classmethod
	def match( cls, *args ):
		"""Match to return the plugin which is appropriate to load"""
	@classmethod
	def all( cls ):
		"""Iterate over all registered plugins"""
		return cls.registry[:]
	
def importByName( fullName ):
	"""Import a class by name"""
	name = fullName.split(".")
	moduleName = name[:-1]
	className = name[-1]
	module = __import__( ".".join(moduleName), {}, {}, moduleName)
	return getattr( module, className )

		
class PlatformPlugin( Plugin ):
	"""Platform-level plugin registration"""
	registry = []
	@classmethod
	def match( cls, key ):
		"""Determine what platform module to load
		
		key -- (sys.platform,os.name) key to load 
		"""
		for plugin in cls.registry:
			if plugin.name in key:
				return plugin
		raise KeyError( """No platform plugin registered for %s"""%(key,))

class FormatHandler( Plugin ):
	"""Data-type storage-format handler"""
	registry = []
	@classmethod
	def match( cls, value ):
		"""Lookup appropriate handler based on value (a type)"""
		key = '%s.%s'%( value.__module__, value.__name__ )
		for plugin in cls.registry:
			set = getattr( plugin, 'check', ())
			if set and key in set:
				return plugin
		return None
