/// <summary>
        /// Adds an animation to the context.
        /// </summary>
        /// <typeparam name="For">The type of the object.</typeparam>
        /// <typeparam name="T">The type of the parameter.</typeparam>
        /// <param name="obj">The object.</param>
        /// <param name="to">The to value.</param>
        /// <param name="propName">The name of the property to animate.</param>
        /// <param name="requiresMainThread">Does the property have to be set on the main thread?</param>
        public void AddAnimation <For, T>(For obj, T to, string propName, bool requiresMainThread)
        {
            DescriptorKey <For, T> key  = new DescriptorKey <For, T>(obj, propName);
            Descriptor <For, T>    desc = new Descriptor <For, T>(obj, to);

            desc.RequiresMainThread = requiresMainThread;

            this.AddDescriptor <For, T>(key, desc);
        }
        /// <summary>
        /// Adds an animation descriptor.
        /// </summary>
        /// <typeparam name="For">The type of the object that we are animating.</typeparam>
        /// <typeparam name="T">The type of the property that we are animating.</typeparam>
        /// <param name="key">The descriptor key.</param>
        /// <param name="desc">The animation descriptor.</param>
        /// <exception cref="ArgumentNullException">Thrown if either |key| or |desc| are null.</exception>
        internal void AddDescriptor <For, T>(DescriptorKey <For, T> key, Descriptor <For, T> desc)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }
            else if (desc == null)
            {
                throw new ArgumentNullException("desc");
            }

            desc.Name = key.PropertyName;

            lock (this.m_descriptors)
            {
                this.m_descriptors[key] = desc;
            }
        }