+ExtensionItem* ExtensionManager::GetItem(const std::string& name)
+{
+ std::map<std::string, reference<ExtensionItem> >::iterator i = types.find(name);
+ if (i == types.end())
+ return NULL;
+ return i->second;
+}
+
+void Extensible::doUnhookExtensions(const std::vector<reference<ExtensionItem> >& toRemove)
+{
+ for(std::vector<reference<ExtensionItem> >::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i)
+ {
+ ExtensionItem* item = *i;
+ ExtensibleStore::iterator e = extensions.find(item);
+ if (e != extensions.end())
+ {
+ item->free(e->second);
+ extensions.erase(e);
+ }
+ }
+}
+
+static struct DummyExtensionItem : LocalExtItem
+{
+ DummyExtensionItem() : LocalExtItem("", NULL) {}
+ void free(void*) {}
+} dummy;
+
+Extensible::Extensible()
+{
+ extensions[&dummy] = NULL;
+}
+
+CullResult Extensible::cull()