/// <summary>
        /// Removes command from property change listener
        /// </summary>
        /// <param name="cmd">Cmd.</param>
        public void RemovePropertyChangeListener(IAtomCommandBase cmd)
        {
            if (cmd == null)
            {
                throw new ArgumentNullException(nameof(cmd));
            }

            var cmdHashCode = cmd.GetHashCode();

            foreach (var curr in Commands)
            {
                if (curr.GetHashCode() == cmdHashCode)
                {
                    Commands.Remove(cmd);

                    break;
                }
            }
        }
        /// <summary>
        /// Registers a command to listen to any property change
        /// </summary>
        /// <param name="cmd">Cmd.</param>
        public void AddPropertyChangeListener(IAtomCommandBase cmd)
        {
            // validate the argument
            if (cmd == null)
            {
                throw new ArgumentNullException(nameof(cmd));
            }

            // make sure that it is added only once
            var cmdHashCode = cmd.GetHashCode();

            foreach (var curr in Commands)
            {
                if (curr.GetHashCode() == cmdHashCode)
                {
                    return;
                }
            }

            // if it does not exist, add the command
            Commands.Add(cmd);
        }