#ifndef SASS_INSPECT_H
#define SASS_INSPECT_H

#include "position.hpp"
#include "operation.hpp"
#include "emitter.hpp"

namespace Sass {
  class Context;

  class Inspect : public Operation_CRTP<void, Inspect>, public Emitter {
  protected:
    // import all the class-specific methods and override as desired
    using Operation_CRTP<void, Inspect>::operator();

  public:

    Inspect(const Emitter& emi);
    virtual ~Inspect();

    // statements
    virtual void operator()(Block*);
    virtual void operator()(StyleRule*);
    virtual void operator()(Bubble*);
    virtual void operator()(SupportsRule*);
    virtual void operator()(AtRootRule*);
    virtual void operator()(AtRule*);
    virtual void operator()(Keyframe_Rule*);
    virtual void operator()(Declaration*);
    virtual void operator()(Assignment*);
    virtual void operator()(Import*);
    virtual void operator()(Import_Stub*);
    virtual void operator()(WarningRule*);
    virtual void operator()(ErrorRule*);
    virtual void operator()(DebugRule*);
    virtual void operator()(Comment*);
    virtual void operator()(If*);
    virtual void operator()(ForRule*);
    virtual void operator()(EachRule*);
    virtual void operator()(WhileRule*);
    virtual void operator()(Return*);
    virtual void operator()(ExtendRule*);
    virtual void operator()(Definition*);
    virtual void operator()(Mixin_Call*);
    virtual void operator()(Content*);
    // expressions
    virtual void operator()(Map*);
    virtual void operator()(Function*);
    virtual void operator()(List*);
    virtual void operator()(Binary_Expression*);
    virtual void operator()(Unary_Expression*);
    virtual void operator()(Function_Call*);
    // virtual void operator()(Custom_Warning*);
    // virtual void operator()(Custom_Error*);
    virtual void operator()(Variable*);
    virtual void operator()(Number*);
    virtual void operator()(Color_RGBA*);
    virtual void operator()(Color_HSLA*);
    virtual void operator()(Boolean*);
    virtual void operator()(String_Schema*);
    virtual void operator()(String_Constant*);
    virtual void operator()(String_Quoted*);
    virtual void operator()(Custom_Error*);
    virtual void operator()(Custom_Warning*);
    virtual void operator()(SupportsOperation*);
    virtual void operator()(SupportsNegation*);
    virtual void operator()(SupportsDeclaration*);
    virtual void operator()(Supports_Interpolation*);
    virtual void operator()(MediaRule*);
    virtual void operator()(CssMediaRule*);
    virtual void operator()(CssMediaQuery*);
    virtual void operator()(Media_Query*);
    virtual void operator()(Media_Query_Expression*);
    virtual void operator()(At_Root_Query*);
    virtual void operator()(Null*);
    virtual void operator()(Parent_Reference* p);
    // parameters and arguments
    virtual void operator()(Parameter*);
    virtual void operator()(Parameters*);
    virtual void operator()(Argument*);
    virtual void operator()(Arguments*);
    // selectors
    virtual void operator()(Selector_Schema*);
    virtual void operator()(PlaceholderSelector*);
    virtual void operator()(TypeSelector*);
    virtual void operator()(ClassSelector*);
    virtual void operator()(IDSelector*);
    virtual void operator()(AttributeSelector*);
    virtual void operator()(PseudoSelector*);
    virtual void operator()(SelectorComponent*);
    virtual void operator()(SelectorCombinator*);
    virtual void operator()(CompoundSelector*);
    virtual void operator()(ComplexSelector*);
    virtual void operator()(SelectorList*);
    virtual sass::string lbracket(List*);
    virtual sass::string rbracket(List*);

  };

}
#endif