#ifndef ERIS_ROOM_HANDLE_H
#define ERIS_ROOM_HANDLE_H

#include <string>

#include "refcount.h"

#include <Eris/Room.h>
#include <Eris/Lobby.h>

// a class to pass to perl as Eris::Room
class RoomHandle
{
 public:
  RoomHandle(Eris::Lobby* l) : lobby_(l), id_(l->getID()),
	is_lobby_(true) {connectionRef(lobby_->getConnection());}
  RoomHandle(Eris::Room* r) : lobby_(r->getLobby()), id_(r->getID()),
	is_lobby_(r == lobby_) {connectionRef(lobby_->getConnection());}
  ~RoomHandle() {connectionUnref(lobby_->getConnection());}

  // only called in lobby typemap conversion
  operator Eris::Lobby*() {assert(is_lobby_); return lobby_;}
  // may return 0 if Room id is stale
  operator Eris::Room*() {return is_lobby_ ? lobby_ : lobby_->getRoom(id_);}

  const std::string& id() const {return id_;}

 private:
  Eris::Lobby* lobby_;
  std::string id_;
  bool is_lobby_;
};

template<>
struct HandleType<Eris::Room*>
{
  typedef RoomHandle type;
};

template<>
struct HandleType<Eris::Lobby*>
{
  typedef RoomHandle type;
};

#endif


syntax highlighted by Code2HTML, v. 0.9.1