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);
};