def remove_configurable(self, configurable_class, name):
configurable_class_name = configurable_class.__name__.lower()<EOL>logger.info("<STR_LIT>", configurable_class_name, name)<EOL>registry = self.registry_for(configurable_class)<EOL>if name not in registry:<EOL><INDENT>logger.warn(<EOL>"<STR_LIT>",<EOL>configurable_class_name, name<EOL>)<EOL>return<EOL><DEDENT>hook = self.hook_for(configurable_class, action="<STR_LIT>")<EOL>if not hook:<EOL><INDENT>registry.pop(name)<EOL>return<EOL><DEDENT>def done(f):<EOL><INDENT>try:<EOL><INDENT>f.result()<EOL>registry.pop(name)<EOL><DEDENT>except Exception:<EOL><INDENT>logger.exception("<STR_LIT>", name)<EOL><DEDENT><DEDENT>self.work_pool.submit(hook, name).add_done_callback(done)<EOL>
Callback fired when a configurable instance is removed.

Looks up the existing configurable in the proper "registry" and
removes it.

If a method named "on_<configurable classname>_remove" is defined it
is called via the work pooland passed the configurable's name.

If the removed configurable is not present, a warning is given and no
further action is taken.