/// <summary>
        /// Gets an AttachedChangedListener using the provided actions.
        /// </summary>
        /// <param name="attachedHandler">An action called when the view is attached</param>
        /// <param name="detachedHandler">An action called when the view is detached</param>
        /// <returns>An AttachedChangedListener instance</returns>
        internal static AttachedChangedListener CreateChangedListener(Action <View> attachedHandler, Action <View> detachedHandler)
        {
            AttachedChangedListener listener;

            if (attachedHandler == null)
            {
                throw new ArgumentNullException(nameof(attachedHandler));
            }
            if (detachedHandler == null)
            {
                throw new ArgumentNullException(nameof(detachedHandler));
            }

            if (_listenerPool.Count != 0)
            {
                listener = _listenerPool.Pop();
            }
            else
            {
                listener = new AttachedChangedListener();
            }

            listener.AttachedHandler = attachedHandler;
            listener.DetachedHandler = detachedHandler;

            return(listener);
        }
        /// <summary>
        /// Releases an AttachedChangedListener instance.
        /// </summary>
        /// <param name="listener">An AttachedChangedListener instance.</param>
        internal static void ReleaseChangedListener(AttachedChangedListener listener)
        {
            if (_listenerPool.Count < MaxPoolInstances)
            {
                listener.AttachedHandler = null;
                listener.DetachedHandler = null;

                _listenerPool.Push(listener);
            }
            else
            {
                listener.AttachedHandler = null;
                listener.DetachedHandler = null;

                listener.Dispose();
            }
        }