/// <summary>
        /// deletes a direct message
        /// </summary>
        /// <param name="ctx">Twitter Context</param>
        /// <param name="id">id of direct message</param>
        /// <param name="callback">Async Callback</param>
        /// <returns>direct message element</returns>
        public static DirectMessage DestroyDirectMessage(this TwitterContext ctx, string id, bool includeEntites, Action <TwitterAsyncResponse <DirectMessage> > callback)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentException("id is a required parameter.", "id");
            }

            var destroyUrl = ctx.BaseUrl + "direct_messages/destroy.json";

            var reqProc = new DirectMessageRequestProcessor <DirectMessage>();

            var twitExe = ctx.TwitterExecutor;

            twitExe.AsyncCallback = callback;
            var resultsJson =
                twitExe.PostToTwitter(
                    destroyUrl,
                    new Dictionary <string, string>
            {
                { "id", id },
                { "include_entities", includeEntites.ToString().ToLower() }
            },
                    response => reqProc.ProcessActionResult(response, DirectMessageType.Show));

            DirectMessage dm = reqProc.ProcessActionResult(resultsJson, DirectMessageType.Show);

            return(dm);
        }
        /// <summary>
        /// sends a new direct message to specified userr
        /// </summary>
        /// <param name="ctx">Twitter Context</param>
        /// <param name="user">UserID or ScreenName of user to send to</param>
        /// <param name="text">Direct message contents</param>
        /// <param name="wrapLinks">Shorten links using Twitter's t.co wrapper</param>
        /// <param name="callback">Async Callback</param>
        /// <returns>Direct message element</returns>
        public static DirectMessage NewDirectMessage(this TwitterContext ctx, string user, string text, Action <TwitterAsyncResponse <DirectMessage> > callback)
        {
            if (string.IsNullOrEmpty(user))
            {
                throw new ArgumentException("user is a required parameter.", "user");
            }

            if (string.IsNullOrEmpty(text))
            {
                throw new ArgumentException("text is a required parameter.", "text");
            }

            var newUrl = ctx.BaseUrl + "direct_messages/new.json";

            var reqProc = new DirectMessageRequestProcessor <DirectMessage>();

            var twitExe = ctx.TwitterExecutor;

            twitExe.AsyncCallback = callback;
            var resultsJson =
                twitExe.PostToTwitter(
                    newUrl,
                    new Dictionary <string, string>
            {
                { "user", user },
                { "text", text }
            },
                    response => reqProc.ProcessActionResult(response, DirectMessageType.Show));

            DirectMessage dm = reqProc.ProcessActionResult(resultsJson, DirectMessageType.Show);

            return(dm);
        }
        /// <summary>
        /// Sends a new direct message to specified user.
        /// </summary>
        /// <param name="userID">User ID of user to send to.</param>
        /// <param name="text">Direct message contents.</param>
        /// <returns>Direct message element.</returns>
        public async Task <DirectMessage> NewDirectMessageAsync(ulong userID, string text, CancellationToken cancelToken = default(CancellationToken))
        {
            if (userID == 0)
            {
                throw new ArgumentException("userID must be set.", "userID");
            }

            if (string.IsNullOrWhiteSpace(text))
            {
                throw new ArgumentException("text is a required parameter.", "text");
            }

            var newUrl = BaseUrl + "direct_messages/new.json";

            var reqProc = new DirectMessageRequestProcessor <DirectMessage>();

            RawResult =
                await TwitterExecutor.PostFormUrlEncodedToTwitterAsync <DirectMessage>(
                    HttpMethod.Post.ToString(),
                    newUrl,
                    new Dictionary <string, string>
            {
                { "user_id", userID.ToString() },
                { "text", text }
            },
                    cancelToken)
                .ConfigureAwait(false);

            return(reqProc.ProcessActionResult(RawResult, DirectMessageType.Show));
        }
        /// <summary>
        /// Deletes a direct message.
        /// </summary>
        /// <param name="id">id of direct message</param>
        /// <param name="includeEntites">Set to false to prevent entities from being included (default: true).</param>
        /// <returns>direct message element</returns>
        public async Task <DirectMessage> DestroyDirectMessageAsync(ulong id, bool includeEntites, CancellationToken cancelToken = default(CancellationToken))
        {
            if (id == 0)
            {
                throw new ArgumentNullException("id", "id is required.");
            }

            var destroyUrl = BaseUrl + "direct_messages/destroy.json";

            var reqProc = new DirectMessageRequestProcessor <DirectMessage>();

            RawResult =
                await TwitterExecutor.PostFormUrlEncodedToTwitterAsync <DirectMessage>(
                    HttpMethod.Post.ToString(),
                    destroyUrl,
                    new Dictionary <string, string>
            {
                { "id", id.ToString() },
                { "include_entities", includeEntites.ToString().ToLower() }
            },
                    cancelToken)
                .ConfigureAwait(false);

            return(reqProc.ProcessActionResult(RawResult, DirectMessageType.Show));
        }
        /// <summary>
        /// Sends a new direct message to specified user.
        /// </summary>
        /// <param name="screenName">ScreenName of user to send to.</param>
        /// <param name="text">Direct message contents.</param>
        /// <returns>Direct message element.</returns>
        public async Task <DirectMessage> NewDirectMessageAsync(string screenName, string text, CancellationToken cancelToken = default(CancellationToken))
        {
            if (string.IsNullOrWhiteSpace(screenName))
            {
                throw new ArgumentException("screenName is a required parameter.", "screenName");
            }

            if (string.IsNullOrWhiteSpace(text))
            {
                throw new ArgumentException("text is a required parameter.", "text");
            }

            var newUrl = BaseUrl + "direct_messages/new.json";

            var reqProc = new DirectMessageRequestProcessor <DirectMessage>();

            RawResult =
                await TwitterExecutor.PostToTwitterAsync <DirectMessage>(
                    newUrl,
                    new Dictionary <string, string>
            {
                { "screen_name", screenName },
                { "text", text }
            },
                    cancelToken)
                .ConfigureAwait(false);

            return(reqProc.ProcessActionResult(RawResult, DirectMessageType.Show));
        }