public static void ShowComponentProperties <T>(T component)
            where T : IComponent
        {
            var componentProperties = component.GetType().GetProperties();

            foreach (var property in componentProperties)
            {
                EditorGUILayout.BeginHorizontal();
                var propertyType  = property.PropertyType;
                var propertyValue = property.GetValue(component, null);

                var handler = DefaultEditorInputRegistry.GetHandlerFor(propertyType);
                if (handler == null)
                {
                    Debug.LogWarning("This type is not supported: " + propertyType.Name + " - In component: " + component.GetType().Name);
                    EditorGUILayout.EndHorizontal();
                    continue;
                }

                var updatedValue = handler.CreateUI(property.Name, propertyValue);

                if (updatedValue != null)
                {
                    property.SetValue(component, updatedValue, null);
                }

                EditorGUILayout.EndHorizontal();
            }
        }
    private static void DrawComponent(GameObject gameObject, IComponent component)
    {
        var componentProperties = component.FieldInfos;

        foreach (var property in componentProperties)
        {
            var propertyType = property.FieldType;

            var handler = DefaultEditorInputRegistry.GetHandlerFor(propertyType);

            if (handler == null)
            {
                Debug.LogWarning("This type is not supported: " + propertyType.Name + " - In component: " +
                                 component.Type.Name);
                continue;
            }

            EditorGUILayout.BeginHorizontal();
            handler.DrawComponentElementUI(gameObject, component, property);
            EditorGUILayout.EndHorizontal();
        }
    }