chromium/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl

class {{export_attribute}} {{interface.name}}StubDispatch {
 public:
  static bool Accept({{interface.name}}* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      {{interface.name}}* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<{{interface.name}}>>
class {{interface.name}}Stub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  {{interface.name}}Stub() = default;
  ~{{interface.name}}Stub() override = default;

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return {{interface.name}}StubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return {{interface.name}}StubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};