- template<typename T, typename S, typename C>
- void add_creator(T *(C::*func)(const std::string &))
- { creators.push_back(new ItemCreator<T, S, C>(func)); }
+ virtual void create_item(Collection &coll, const std::string &name) const
+ {
+ if(!creat)
+ throw std::runtime_error("no creator");
+ T *obj = creat->create(coll, name);
+ if(obj)
+ coll.add(name, obj);
+ }
+
+ virtual void load_item(Collection &, Parser &, const std::string &) const
+ {
+ throw std::runtime_error("this type cannot be loaded");
+ }
+
+ virtual void notify_item(Collection &coll, const std::string &name, const Variant &var) const
+ {
+ RefPtr<T> obj = var.value<RefPtr<T> >();
+ for(typename std::vector<NotifyeeBase *>::const_iterator i=notif.begin(); i!=notif.end(); ++i)
+ (*i)->notify(coll, name, *obj);
+ }
+};
+
+
+template<typename T>
+class LoadableCollectionItemType: public CollectionItemType<T>
+{
+public:
+ virtual void add_to_loader(Collection::Loader &loader) const
+ { loader.add(this->kwd, &Collection::Loader::item<T, T>); }
+
+ virtual void load_item(Collection &coll, Parser &parser, const std::string &name) const
+ {
+ RefPtr<T> obj = new T;
+ Collection::ItemLoader<T> ldr(*obj, coll);
+ ldr.load(parser);
+ coll.add(name, obj.get());
+ obj.release();
+ }