//////////////////////////////////////////////////////////////////////////
// source control interface
struct ISourceControl : public ICryUnknown
{
  CRYINTERFACE_DECLARE(ISourceControl, 0x399d8fc1d94044cc, 0xa70d2b4e58921453)
  virtual void GetLatest(const char* filename) = 0;
  virtual void Submit() = 0;
};
typedef cryshared_ptr<ISourceControl> ISourceControlPtr;
//////////////////////////////////////////////////////////////////////////
// concrete implementations of source control interface
class CSourceControl_Perforce : public ISourceControl
{
  CRYINTERFACE_BEGIN()
    CRYINTERFACE_ADD(ISourceControl)
  CRYINTERFACE_END()
  CRYGENERATE_SINGLETONCLASS(CSourceControl_Perforce, "CSourceControl_Perforce", 0x7305bff20ee543e3, 0x820792c56e74ecda)
  virtual void GetLatest(const char* filename) { ... };
  virtual void Submit() { ... };
};
CRYREGISTER_CLASS(CSourceControl_Perforce)
class CSourceControl_SourceSafe : public ISourceControl
{
  CRYINTERFACE_BEGIN()
    CRYINTERFACE_ADD(ISourceControl)
  CRYINTERFACE_END()
  CRYGENERATE_SINGLETONCLASS(CSourceControl_SourceSafe, "CSourceControl_SourceSafe", 0x1df62628db9d4bb2, 0x8164e418dd5b6691)
  virtual void GetLatest(const char* filename) { ... };
  virtual void Submit() { ... };
};
CRYREGISTER_CLASS(CSourceControl_SourceSafe)
//////////////////////////////////////////////////////////////////////////
// using the interface (submitting changes)
void Submit()
{
  ICryFactoryRegistry* pReg = gEnv->pSystem->GetFactoryRegistry();
  ICryFactory* pFactory = 0;
  size_t numFactories = 1;
  pReg->IterateFactories(cryiidof<ISourceControl>(), &pFactory, numFactories);
  if (pFactory)
  {
    ISourceControlPtr pSrcCtrl = cryinterface_cast<ISourceControl>(pFactory->CreateClassInstance());
    if (pSrcCtrl)
    {
      pSrcCtl->Submit();
    }
  }
}