public PatternResult Register(PatternIdent patternIdent)
        {
            if (InstanceId != 0)
            {
                throw new InvalidOperationException();
            }

            if (!m_IdLink.ContainsValue(patternIdent.Name))
            {
                var id = m_IdCounter++;
                m_IdLink[id] = patternIdent.Name;

                var patternResult = new PatternResult
                {
                    Id       = id,
                    Internal = patternIdent
                };

                m_ResultLink[patternIdent.Name] = patternResult;
                PatternRegister?.Invoke(patternResult);
            }
            else
            {
                Debug.LogWarning($"Some systems are trying to register an already existing pattern! (p={patternIdent.Name})");
            }

            m_StringLink[patternIdent.Name] = patternIdent;

            return(GetPatternResult(patternIdent));
        }
        internal static void ObjRegister(object holder, PatternBank bank)
        {
            var type   = holder.GetType();
            var fields = type.GetFields
                         (
                BindingFlags.Public
                | BindingFlags.NonPublic
                | BindingFlags.Static
                | BindingFlags.Instance
                         );

            foreach (var field in fields)
            {
                if (field.FieldType != typeof(PatternIdent) && field.FieldType != typeof(PatternResult))
                {
                    continue;
                }

                var nv               = field.GetCustomAttribute <PatternAttribute>();
                var nameAttribute    = field.GetCustomAttribute <PatternNameAttribute>();
                var versionAttribute = field.GetCustomAttribute <PatternVersionAttribute>();

                var pattern = new PatternIdent {
                    Name = nv?.Name ?? nameAttribute?.Value
                };

                if (string.IsNullOrEmpty(pattern.Name))
                {
                    pattern.Name = $"{type.Namespace}:{type.Name}.{field.Name}";
                }

                if (nv != null)
                {
                    pattern.Version = nv.Version;
                }
                else if (versionAttribute != null)
                {
                    pattern.Version = versionAttribute.Value;
                }

                var result = bank.Register(pattern);

                if (field.FieldType == typeof(PatternIdent))
                {
                    field.SetValue(holder, pattern);
                }
                else
                {
                    field.SetValue(holder, result);
                }
            }
        }
 public bool Equals(PatternIdent other)
 {
     return(Name == other.Name);
 }
 public PatternResult GetPatternResult(PatternIdent pattern)
 {
     return(m_ResultLink[pattern.Name]);
 }
 public bool HasPattern(PatternIdent patternIdent)
 {
     return(m_StringLink.ContainsKey(patternIdent.Name));
 }