AbstractModel is the new base class for every model.
If requires all models to implement ``ModelType getType()``
And implements ``as<ModelClass>()`` performing a dynamic cast on a shared pointer, assuming that we will always use Models within shared pointers.