+/**
+Describes a type of item that can be loaded by a Collection. These are created
+by Collection::add_type.
+*/
+template<typename T>
+class CollectionItemType: public CollectionItemTypeBase
+{
+private:
+ struct CreatorBase
+ {
+ virtual ~CreatorBase() { }
+
+ virtual T *create(Collection &, const std::string &) const = 0;
+ };
+
+ template<typename C>
+ struct Creator: CreatorBase
+ {
+ typedef T *(C::*FuncPtr)(const std::string &);
+
+ FuncPtr func;
+
+ Creator(FuncPtr f): func(f) { }
+
+ virtual T *create(Collection &coll, const std::string &name) const
+ { return (dynamic_cast<C &>(coll).*func)(name); }
+ };
+
+ struct NotifyeeBase
+ {
+ virtual ~NotifyeeBase() { }
+
+ virtual void notify(Collection &, const std::string &, T &) const = 0;
+ };
+
+ template<typename C>
+ struct Notifyee: NotifyeeBase
+ {
+ typedef void (C::*FuncPtr)(const std::string &, T &);
+
+ FuncPtr func;
+
+ Notifyee(FuncPtr f): func(f) { }
+
+ virtual void notify(Collection &coll, const std::string &name, T &item) const
+ { (dynamic_cast<C &>(coll).*func)(name, item); }
+ };
+
+ template<typename B>
+ struct Extractor: CollectionItemTypeBase::Extractor<B>
+ {
+ virtual B &extract(const Variant &var) const
+ { return *var.value<RefPtr<T> >(); }
+ };
+
+ CreatorBase *creat;
+ std::vector<NotifyeeBase *> notif;