export module builder; import ; export template struct Builder; template struct BuildMixin {}; template <> struct BuildMixin { auto build(this auto&& self) requires requires { self.p1 + self.p2; } { return self.p1 + self.p2; } }; template struct Param1Mixin {}; template <> struct Param1Mixin { auto fill_param1(this auto&& self) requires requires { self.p1; } { self.p1 = 1; return Builder::param2_v>( self); } }; template struct Param2Mixin {}; template <> struct Param2Mixin { auto fill_param2(this auto&& self) requires requires { self.p2; } { self.p2 = 1; return Builder::param1_v, true>( self); } }; template struct Builder : BuildMixin, Param1Mixin, Param2Mixin { const constinit static auto param1_v = param1; const constinit static auto param2_v = param2; int p1; int p2; Builder() : p1(0), p2(0) {} Builder(auto&& other) : p1(other.p1), p2(other.p2) {} };