#pragma once #include namespace erebos { class Identity { public: static std::optional load(const Ref &); static std::optional load(const std::vector &); std::optional name() const; std::optional owner() const; Stored keyMessage() const; std::optional ref() const; class Builder { public: Identity commit() const; void name(const std::string &); void owner(const Identity &); private: friend class Identity; struct Priv; const std::shared_ptr p; Builder(Priv * p): p(p) {} }; static Builder create(const Storage &); Builder modify() const; private: struct Priv; const std::shared_ptr p; Identity(const Priv * p): p(p) {} Identity(std::shared_ptr && p): p(std::move(p)) {} }; }