template class EE::UI::UIProperty

#include <uiproperty.hpp>

template <typename T>
class UIProperty {
public:
    // construction

    UIProperty();
    UIProperty(T defaultValue, UIWidget* widget, const typename EE::UI::UIDataBind<T>::Converter& converter = EE::UI::UIDataBind<T>::converterDefault(), const std::string& valueKey = "value", const Event::EventType& eventType = Event::OnValueChange);
    UIProperty(T defaultValue, const std::unordered_set<UIWidget*>& widgets = {}, const typename EE::UI::UIDataBind<T>::Converter& converter = EE::UI::UIDataBind<T>::converterDefault(), const std::string& valueKey = "value", const Event::EventType& eventType = Event::OnValueChange);
    UIProperty(const std::unordered_set<UIWidget*>& widgets = {}, const typename EE::UI::UIDataBind<T>::Converter& converter = EE::UI::UIDataBind<T>::converterDefault(), const std::string& valueKey = "value", const Event::EventType& eventType = Event::OnValueChange);
    UIProperty(UIWidget* widget, const typename EE::UI::UIDataBind<T>::Converter& converter = EE::UI::UIDataBind<T>::converterDefault(), const std::string& valueKey = "value", const Event::EventType& eventType = Event::OnValueChange);

    // methods

    void operator=(const T& newVal);
    void operator=(T&& newVal);
    const T& value() const;
    const UIDataBind<T>& databind() const;
    UIProperty& connect(UIWidget* widget);
    UIProperty& disconnect(UIWidget* widget);
    const T& operator*() const;
    const T* operator->() const;
    operator const T &() const;
    UIProperty& changed(const std::function<void(const T&newVal)>& fn);
    UIProperty& changed(std::function<void(const T&newVal)>&& fn);
};