#ifndef _CTOKEN
#define _CTOKEN

#include "types.h"

#include "Kyoto/CObjectReference.hpp"
#include "Kyoto/IObj.hpp"

class CObjectReference;

class CToken {
public:
  CToken() {}
  CToken(CObjectReference* ref);
  CToken(IObj* obj); // : x0_objRef(new CObjectReference(obj)), x4_lockHeld(false) {}
  CToken(const CToken& other);
  ~CToken();

  CObjOwnerDerivedFromIObjUntyped* GetObj();
  void Lock();
  void Unlock();
  bool IsLoaded() const { return x0_objRef->IsLoaded(); }
  void RemoveRef();
  CToken& operator=(const CToken&);
  bool HasReference() const { return x0_objRef != nullptr; }
  const SObjectTag& GetTag() const { return x0_objRef->GetTag(); }
  FourCC GetReferenceType() { return GetTag().GetType(); }

  bool HasLock() { return x4_lockHeld; }

  const CObjectReference* GetRef() const { return x0_objRef; }

private:
  CObjectReference* x0_objRef;
  bool x4_lockHeld;
};

#endif // _CTOKEN
