#pragma once

#include <boost/variant/static_visitor.hpp>

#include "mstch/mstch.hpp"

namespace mstch
{

class has_token : public boost::static_visitor<bool>
{
public:
  has_token(const std::string &token) : m_token(token) {}

  template <class T> bool operator()(const T &) const { return m_token == "."; }

  bool operator()(const map &map) const { return map.count(m_token) == 1; }

  bool operator()(const std::shared_ptr<object> &object) const { return object->has(m_token); }

private:
  const std::string &m_token;
};
}