#ifndef MATADOR_OBJECT_GENERATOR_HPP #define MATADOR_OBJECT_GENERATOR_HPP #include "matador/object/attribute.hpp" #include "matador/object/attribute_generator.hpp" #include "matador/object/constraint.hpp" #include "matador/object/constraints_generator.hpp" namespace matador::object { class repository; class object { public: explicit object(std::string name, std::string alias = ""); template static std::unique_ptr generate(const repository& repo, std::string name, std::string alias = "") { auto obj = std::make_unique(std::move(name), std::move(alias)); obj->attributes_ = std::move(attribute_generator::generate(repo, *obj)); obj->constraints_ = std::move(constraints_generator::generate(repo, *obj)); return std::move(obj); } static const attribute& create_attribute(std::string name, object& obj); void add_attribute(attribute attr); void add_constraint(class constraint c); [[nodiscard]] const std::string& name() const; [[nodiscard]] const std::string& alias() const; [[nodiscard]] bool has_attributes() const; [[nodiscard]] size_t attribute_count() const; [[nodiscard]] const std::vector& attributes() const; [[nodiscard]] bool has_constraints() const; [[nodiscard]] size_t constraint_count() const; [[nodiscard]] const std::vector& constraints() const; private: friend class constraints_generator; std::string name_; std::string alias_; std::vector attributes_; std::vector constraints_; }; } #endif //MATADOR_OBJECT_GENERATOR_HPP