%module(package="csmapi") plugin
%{
    #include "Plugin.h"
    typedef csm::Plugin Plugin;
%}

%include <std_string.i>
%include <std_list.i>
%include Model.h

%apply SWIGTYPE *DYNAMIC { csm::Model * };

%include Plugin.h
typedef csm::Plugin Plugin;
// Returns a list of pointer to pointers (which is necessary because the 
// plugin is an abstract base class...)
%template(PluginList) std::list<const csm::Plugin*>;
%{
    namespace swig {
    template <> struct traits<csm::Plugin>
    {
        typedef pointer_category category;
        static const char* type_name()
        {
            return "Plugin";
        }
    };
    }
%}

// A general purpose function for dynamic casting of a Model *
%{
static swig_type_info *
Model_dynamic(void **ptr) {
   csm::RasterGM *b;
   b = dynamic_cast<csm::RasterGM *>((csm::Model *) *ptr);
   if (b) {
      *ptr = (void *) b;
      return SWIGTYPE_p_csm__RasterGM;
   }
   return 0;
}
%}

// Register the above casting function
DYNAMIC_CAST(SWIGTYPE_p_csm__Model, Model_dynamic);