public virtual void Copy(UpdatingComponent source)
    {
        System.Type type = source.GetType();

        if (this.GetType() != type)
        {
            Debug.LogError(name + ": Cannot copy a " + type + " onto a " + this.GetType());
            return;
        }

        System.Reflection.FieldInfo[] fields = type.GetFields();

        foreach (System.Reflection.FieldInfo field in fields)
        {
            if (field.FieldType.ToString().EndsWith("Event")) // for skipping events - fields with names ending "Event"
            {
                continue;
            }

            Debug.Log("Copying field " + field.Name + " (" + field.Attributes + "!!!" + field.FieldType + ")");
            field.SetValue(this, field.GetValue(source));
        }

        // Mark dirty now, before the mirroring is established, to set up UI elements if there are any
        MakeDirty();
        Debug.Log("Copied " + source.name + " onto " + name + " C" + type + ")");
    }