+ class ActionDefLoader;
+
+ class RegisteredAction
+ {
+ public:
+ typedef void (ActionDefLoader::*LoaderFunc)();
+
+ virtual ~RegisteredAction() { }
+ virtual LoaderFunc get_loader_func() const = 0;
+ };
+
+ template<typename T>
+ class RegisteredActionType: public RegisteredAction
+ {
+ public:
+ virtual LoaderFunc get_loader_func() const;
+ };
+
+ class ActionDefLoader: public Msp::DataFile::ObjectLoader<Sequencer>
+ {
+ private:
+ Demo &demo;
+ Msp::RefPtr<Action> action;
+
+ public:
+ ActionDefLoader(Sequencer &, Demo &);
+
+ Action *get_action() { return action.release(); }
+
+ private:
+ virtual void finished();
+
+ template<typename T>
+ void action_def();
+
+ template<typename T>
+ friend class RegisteredActionType;
+ };
+