# Skill: Core Object & Property System This skill defines the patterns for implementing and working with the `uLib` core object model. ## Context - **Base Class**: `uLib::Object` - **Property System**: `uLib::Property` - **Registration**: All objects must register their properties for UI visibility and serialization. ## Implementation Patterns ### 1. Defining an Object Inherit from `uLib::Object` and use the `ULIB_PROPERTY` macro for members. ```cpp class MyObject : public uLib::Object { public: ULIB_PROPERTY(double, Speed, 0.0) ULIB_PROPERTY(std::string, Description, "None") MyObject() { // Required for property visibility in PropertyEditor ULIB_ACTIVATE_PROPERTIES(*this) } }; ``` ### 2. Property Access Properties can be treated like their underlying types or accessed via `.Get()`/`.Set()`. ```cpp obj.Speed = 10.5; // Triggers Updated() signal double s = obj.Speed; // Implicit conversion obj.Speed.SetRange(0.0, 100.0); // Setting metadata ``` ### 3. Serialization Implement `serialize` overloads for different archive types. Use `hrp` (Human Readable Property) to name fields. ```cpp template void serialize(ArchiveT &ar, const unsigned int version) { ar & boost::serialization::make_nvp("InstanceName", this->GetInstanceName()); ar & boost::serialization::make_hrp("Speed", Speed, "m/s"); } ``` ## Checklist - [ ] Inherit from `uLib::Object`. - [ ] Use `ULIB_PROPERTY` for members that should appear in the GUI. - [ ] Call `ULIB_ACTIVATE_PROPERTIES` in the constructor. - [ ] Implement `serialize` if persistence is required.