+ typename CollectionItemTypeChooser<T>::Type &add_type();
+
+ /** Returns a mutable reference to an existing type descriptor. This can be
+ used to e.g. override the creator function of a type added by a base class. */
+ template<typename T>
+ typename CollectionItemTypeChooser<T>::Type &modify_type();
+
+private:
+ /** Returns the descriptor for a type, or null if one isn't defined. An
+ optional name can be given to prioritize matching types. */
+ template<typename T>
+ CollectionItemTypeBase *get_type(const std::string & = std::string()) const;
+
+ /// Gets a descriptor with the same type as another descriptor.
+ CollectionItemTypeBase *get_type(const CollectionItemTypeBase &) const;
+
+ /// Returns the descriptor for an item, or null if it's of an unknown type.
+ CollectionItemTypeBase *get_type_for_item(const Variant &) const;
+
+protected:
+ /** Adds a source for automatically loading items. Sources are consulted
+ in the order they are added. */
+ void add_source(const CollectionSource &);
+
+public:
+ /** Opens a raw resource, without interpreting it as object data. Null is
+ returned if no such file is found. The caller must dispose of the returned
+ object when done with it. */
+ IO::Seekable *open_raw(const std::string &) const;
+
+private:
+ void gather_names_from_sources(std::list<std::string> &, const CollectionItemTypeBase &) const;
+
+ void load_items_from_sources(const CollectionItemTypeBase &);
+
+protected:
+ /** Sets a fallback collection, which will be consulted if an item is not
+ found. */
+ void set_fallback(Collection *);