@classmethod<EOL><INDENT>def get_installed_classes(cls):<DEDENT>
installed_classes = {}<EOL>for entry_point in pkg_resources.iter_entry_points(cls.entry_point):<EOL><INDENT>try:<EOL><INDENT>plugin = entry_point.load()<EOL><DEDENT>except ImportError as e:<EOL><INDENT>logger.error(<EOL>"<STR_LIT>", entry_point.name, str(e)<EOL>)<EOL>continue<EOL><DEDENT>if not issubclass(plugin, cls):<EOL><INDENT>logger.error(<EOL>"<STR_LIT>" +<EOL>"<STR_LIT>",<EOL>entry_point.name, plugin.__class__.__name__, cls.__name__<EOL>)<EOL>continue<EOL><DEDENT>if not plugin.validate_dependencies():<EOL><INDENT>logger.error(<EOL>"<STR_LIT>" +<EOL>"<STR_LIT>",<EOL>entry_point.name, plugin.__name__<EOL>)<EOL>continue<EOL><DEDENT>installed_classes[entry_point.name] = plugin<EOL><DEDENT>return installed_classes<EOL>
Iterates over installed plugins associated with the `entry_point` and
returns a dictionary of viable ones keyed off of their names.

A viable installed plugin is one that is both loadable *and* a subclass
of the Pluggable subclass in question.