// https://www.youtube.com/watch?v=nLSm3Haxz0I class MyWidget { void tinker_with(int amount); public: class Tinkerable; Tinkerable get_tinkerable(){ return Tinkerable(*this); } }; class MyWidget::Tinkerable { MyWidget& widget_; std::scoped_lock lock_; friend MyWidget; explicit Tinkerable(MyWidget& widget) : widget_(widget), lock_(widget_.mutex_) {} public: void tinker_with(int amount){ widget_.thinker_with(amount); } }; void tinker(MyWidget& widget) { auto tinkerable = widget.get_tinkerable(); tinkerable.tinker_with(123); tinkerable.tinker_with(456); }