/// <summary>
        /// Purchase/provision a toll-free number
        /// </summary>
        /// <param name="options">Optional parameters to include when purchasing number</param>
        /// <param name="callback">Method to call upon successful completion</param>
        public void AddTollFreePhoneNumber(PhoneNumberOptions options, Action<IncomingPhoneNumber> callback)
        {
            var request = new RestRequest(Method.POST);
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/TollFree";
            request.RootElement = "IncomingPhoneNumber";

            AddPhoneNumberOptionsToRequest(request, options);

            ExecuteAsync<IncomingPhoneNumber>(request, (response) => callback(response));
        }
        public IncomingPhoneNumber PurchasePhoneNumber(string phoneNumber, string applicationSid)
        {
            var phoneNumberOptions = new PhoneNumberOptions
            {
                PhoneNumber = phoneNumber,
                VoiceApplicationSid = applicationSid
            };

            return _client.AddIncomingPhoneNumber(phoneNumberOptions);
        }
    static void Main(string[] args)
    {
        // Find your Account Sid and Auth Token at twilio.com/user/account
        string AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        string AuthToken = "your_auth_token";
        var twilio = new TwilioRestClient(AccountSid, AuthToken);

        var options = new PhoneNumberOptions();
        options.VoiceUrl = "http://demo.twilio.com/docs/voice.xml";
        options.SmsUrl = "http://demo.twilio.com/docs/sms.xml";

        twilio.UpdateIncomingPhoneNumber("PN2a0747eba6abf96b7e3c3ff0b4530f6e", options);
    }
    static void Main(string[] args)
    {
        // Find your Account Sid and Auth Token at twilio.com/user/account
        string AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        string AuthToken = "your_auth_token";
        string CurrentAccount = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        var twilio = new TwilioRestClient(AccountSid, AuthToken, CurrentAccount);

        var options = new PhoneNumberOptions();
        options.AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

        twilio.UpdateIncomingPhoneNumber("PN2a0747eba6abf96b7e3c3ff0b4530f6e", options);
    }
    static void Main(string[] args)
    {
        // Find your Account Sid and Auth Token at twilio.com/user/account
        string AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        string AuthToken = "your_auth_token";
        var twilio = new TwilioRestClient(AccountSid, AuthToken);

        var options = new PhoneNumberOptions();
        options.PhoneNumber = "33";
        var number = twilio.AddIncomingPhoneNumber(options);

        Console.WriteLine(number.Sid);
    }
        /// <summary>
        /// Purchase/provision a toll free phone number
        /// </summary>
        /// <param name="options">Optional parameters to use when purchasing number</param>
        /// <param name="callback">Method to call upon successful completion</param>
        public virtual void AddIncomingTollFreePhoneNumber(PhoneNumberOptions options, Action<IncomingPhoneNumber> callback)
        {
            Require.Argument("PhoneNumber", options.PhoneNumber);

            var request = new RestRequest(Method.POST);
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/TollFree.json";

            //PhoneNumber is required for this resource
            request.AddParameter("PhoneNumber", options.PhoneNumber);

            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            ExecuteAsync<IncomingPhoneNumber>(request, (response) => callback(response));
        }
        /// <summary>
        /// Purchase/provision a toll free phone number
        /// </summary>
        /// <param name="options">Optional parameters to use when purchasing number</param>
        public virtual IncomingPhoneNumber AddIncomingTollFreePhoneNumber(PhoneNumberOptions options)
        {
            Require.Argument("PhoneNumber", options.PhoneNumber);

            var request = new RestRequest(Method.POST);
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/TollFree.json";

            //PhoneNumber is required for this resource
            request.AddParameter("PhoneNumber", options.PhoneNumber);

            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            return Execute<IncomingPhoneNumber>(request);
        }
    static void Main(string[] args)
    {
        // Find your Account Sid and Auth Token at twilio.com/user/account
        string AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        string AuthToken = "your_auth_token";
        var twilio = new TwilioRestClient(AccountSid, AuthToken);

        var options = new PhoneNumberOptions();
        options.FriendlyName = "My Company Line";
        options.VoiceUrl = "http://demo.twilio.com/docs/voice.xml";
        options.PhoneNumber = "+15105647903";
        options.VoiceMethod = "GET";
        var number = twilio.AddIncomingPhoneNumber(options);

        Console.WriteLine(number.Sid);
    }
    static void Main(string[] args)
    {
        // Find your Account Sid and Auth Token at twilio.com/user/account
        string AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        string AuthToken = "your_auth_token";
        var twilio = new TwilioRestClient(AccountSid, AuthToken);

        var result = twilio.ListAvailableTollFreePhoneNumbers("US");

        // Purchase the first number on the list
        var availableNumber = result.AvailablePhoneNumbers[0];
        var purchaseOptions = new PhoneNumberOptions();
        purchaseOptions.PhoneNumber = availableNumber.PhoneNumber;

        var number = twilio.AddIncomingPhoneNumber(purchaseOptions);
        Console.WriteLine(number.Sid);
    }
        /// <summary>
        /// Purchase/provision a phone number
        /// </summary>
        /// <param name="options">Optional parameters to use when purchasing number</param>
        public virtual IncomingPhoneNumber AddIncomingPhoneNumber(PhoneNumberOptions options)
        {
            var request = new RestRequest(Method.POST);
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers.json";

            if (options.PhoneNumber.HasValue())
            {
                request.AddParameter("PhoneNumber", options.PhoneNumber);
            }
            else
            {
                if (options.AreaCode.HasValue()) request.AddParameter("AreaCode", options.AreaCode);
            }

            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            return Execute<IncomingPhoneNumber>(request);
        }
        /// <summary>
        /// Purchase/provision a local phone number. Makes a POST request to the IncomingPhoneNumber List resource.
        /// </summary>
        /// <param name="options">Optional parameters to use when purchasing number</param>
        /// <param name="callback">Method to call upon successful completion</param>
        public void AddIncomingPhoneNumber(PhoneNumberOptions options, Action<IncomingPhoneNumber> callback)
        {
            var request = new RestRequest(Method.POST);
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers.json";

            if (options.PhoneNumber.HasValue())
            {
                request.AddParameter("PhoneNumber", options.PhoneNumber);
            }
            else
            {
                if (options.AreaCode.HasValue()) request.AddParameter("AreaCode", options.AreaCode);
            }

            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            ExecuteAsync<IncomingPhoneNumber>(request, (response) => callback(response));
        }
        private async Task<IncomingPhoneNumber> AddIncomingPhoneNumberAsyncInternal(PhoneNumberOptions options)
		{
			var request = new RestRequest();
            request.Method = Method.POST;
			request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers.json";
			
			if (options.PhoneNumber.HasValue())
			{
				request.AddParameter("PhoneNumber", options.PhoneNumber);
			}
			else
			{
				if (options.AreaCode.HasValue()) request.AddParameter("AreaCode", options.AreaCode);
			}

			AddPhoneNumberOptionsToRequest(request, options);
			AddSmsOptionsToRequest(request, options);

            var result = await ExecuteAsync(request, typeof(IncomingPhoneNumber));
            return (IncomingPhoneNumber)result;
		}
    static void Main(string[] args)
    {
        // Find your Account Sid and Auth Token at twilio.com/user/account
        string AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        string AuthToken = "your_auth_token";
        var twilio = new TwilioRestClient(AccountSid, AuthToken);

        var options = new AvailablePhoneNumberListRequest();
        options.NearLatLong = "37.840699,-122.461853";
        options.Distance = 50;
        options.Contains = "555";
        options.InRegion = "CA";

        var result = twilio.ListAvailableLocalPhoneNumbers("US", options);

        // Purchase the first number on the list
        var availableNumber = result.AvailablePhoneNumbers[0];
        var purchaseOptions = new PhoneNumberOptions();
        purchaseOptions.PhoneNumber = availableNumber.PhoneNumber;

        var number = twilio.AddIncomingPhoneNumber(purchaseOptions);
        Console.WriteLine(number.Sid);
    }
		private void AddSmsOptionsToRequest(RestRequest request, PhoneNumberOptions options)
		{
			// some check for null. in those cases an empty string is a valid value (to remove a URL assignment)
			if (options.SmsApplicationSid != null) request.AddParameter("SmsApplicationSid", options.SmsApplicationSid);
			if (options.SmsUrl != null) request.AddParameter("SmsUrl", options.SmsUrl);
			if (options.SmsMethod.HasValue()) request.AddParameter("SmsMethod", options.SmsMethod.ToString());
			if (options.SmsFallbackUrl != null) request.AddParameter("SmsFallbackUrl", options.SmsFallbackUrl);
			if (options.SmsFallbackMethod.HasValue()) request.AddParameter("SmsFallbackMethod", options.SmsFallbackMethod.ToString());
		}
 /// <summary>
 /// Purchase/provision a local phone number
 /// </summary>
 /// <param name="options">Optional parameters to use when purchasing number</param>
 public IAsyncOperation <IncomingPhoneNumber> AddIncomingPhoneNumberAsync(PhoneNumberOptions options)
 {
     return((IAsyncOperation <IncomingPhoneNumber>)AsyncInfo.Run((System.Threading.CancellationToken ct) => AddIncomingPhoneNumberAsyncInternal(options)));
 }
		/// <summary>
		/// Purchase/provision a local phone number
		/// </summary>
		/// <param name="options">Optional parameters to use when purchasing number</param>
        public IAsyncOperation<IncomingPhoneNumber> AddIncomingPhoneNumberAsync(PhoneNumberOptions options)
        {
            return (IAsyncOperation<IncomingPhoneNumber>)AsyncInfo.Run((System.Threading.CancellationToken ct) => AddIncomingPhoneNumberAsyncInternal(options));
        }
        private async Task<IncomingPhoneNumber> UpdateIncomingPhoneNumberAsyncInternal(string incomingPhoneNumberSid, PhoneNumberOptions options)
		{
			Require.Argument("IncomingPhoneNumberSid", incomingPhoneNumberSid);

            var request = new RestRequest();
            request.Method = Method.POST;
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/{IncomingPhoneNumberSid}.json";
			
			request.AddParameter("IncomingPhoneNumberSid", incomingPhoneNumberSid, ParameterType.UrlSegment);
			AddPhoneNumberOptionsToRequest(request, options);
			AddSmsOptionsToRequest(request, options);

            var result = await ExecuteAsync(request, typeof(IncomingPhoneNumber));
            return (IncomingPhoneNumber)result;
        }
		/// <summary>
		/// Update the settings of an incoming phone number
		/// </summary>
		/// <param name="incomingPhoneNumberSid">The Sid of the phone number to update</param>
		/// <param name="options">Which settings to update. Only properties with values set will be updated.</param>
        public IAsyncOperation<IncomingPhoneNumber> UpdateIncomingPhoneNumberAsync(string incomingPhoneNumberSid, PhoneNumberOptions options)
        {
            return (IAsyncOperation<IncomingPhoneNumber>)AsyncInfo.Run((System.Threading.CancellationToken ct) => UpdateIncomingPhoneNumberAsyncInternal(incomingPhoneNumberSid, options));
        }
        /// <summary>
        /// Purchase/provision a local phone number
        /// </summary>
        /// <param name="options">Optional parameters to use when purchasing number</param>
        public virtual async Task<IncomingPhoneNumber> AddIncomingLocalPhoneNumberAsync(PhoneNumberOptions options)
        {
            Require.Argument("PhoneNumber", options.PhoneNumber);

            var request = new RestRequest(Method.POST);
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/Local.json";

            //PhoneNumber is required for this resource
            request.AddParameter("PhoneNumber", options.PhoneNumber);

            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            return await Execute<IncomingPhoneNumber>(request);
        }
        private async Task <IncomingPhoneNumber> UpdateIncomingPhoneNumberAsyncInternal(string incomingPhoneNumberSid, PhoneNumberOptions options)
        {
            Require.Argument("IncomingPhoneNumberSid", incomingPhoneNumberSid);

            var request = new RestRequest();

            request.Method   = Method.POST;
            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/{IncomingPhoneNumberSid}.json";

            request.AddParameter("IncomingPhoneNumberSid", incomingPhoneNumberSid, ParameterType.UrlSegment);
            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            var result = await ExecuteAsync(request, typeof(IncomingPhoneNumber));

            return((IncomingPhoneNumber)result);
        }
		/// <summary>
		/// Update the settings of an incoming phone number.
		/// </summary>
		/// <param name="incomingPhoneNumberSid">The Sid of the phone number to update</param>
		/// <param name="options">Which settings to update. Only properties with values set will be updated.</param>
		/// <param name="callback">Method to call upon successful completion</param>
        public virtual void UpdateIncomingPhoneNumber(string incomingPhoneNumberSid, PhoneNumberOptions options, Action<IncomingPhoneNumber> callback)
		{
			Require.Argument("IncomingPhoneNumberSid", incomingPhoneNumberSid);

			var request = new RestRequest(Method.POST);
			request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/{IncomingPhoneNumberSid}.json";
			
			request.AddParameter("IncomingPhoneNumberSid", incomingPhoneNumberSid, ParameterType.UrlSegment);
			AddPhoneNumberOptionsToRequest(request, options);
			AddSmsOptionsToRequest(request, options);

			ExecuteAsync<IncomingPhoneNumber>(request, (response) => callback(response));
		}
        /// <summary>
        /// Update the settings of an incoming phone number
        /// </summary>
        /// <param name="incomingPhoneNumberSid">The Sid of the phone number to update</param>
        /// <param name="options">Which settings to update. Only properties with values set will be updated.</param>
        public virtual IncomingPhoneNumber UpdateIncomingPhoneNumber(string incomingPhoneNumberSid, PhoneNumberOptions options)
        {
            Require.Argument("IncomingPhoneNumberSid", incomingPhoneNumberSid);

            var request = new RestRequest(Method.POST);

            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/{IncomingPhoneNumberSid}.json";

            request.AddParameter("IncomingPhoneNumberSid", incomingPhoneNumberSid, ParameterType.UrlSegment);
            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            return(Execute <IncomingPhoneNumber>(request));
        }
        private void AddPhoneNumberOptionsToRequest(RestRequest request, PhoneNumberOptions options)
		{
            if (options.AccountSid.HasValue())
            {
                request.AddParameter("AccountSid", options.AccountSid);
            }

			if (options.FriendlyName.HasValue())
			{
				Validate.IsValidLength(options.FriendlyName, 64);
				request.AddParameter("FriendlyName", options.FriendlyName);
			}
			// some check for null. in those cases an empty string is a valid value (to remove a URL assignment)
			if (options.VoiceApplicationSid != null) request.AddParameter("VoiceApplicationSid", options.VoiceApplicationSid);

			if (options.VoiceUrl != null) request.AddParameter("VoiceUrl", options.VoiceUrl);
			if (options.VoiceMethod.HasValue()) request.AddParameter("VoiceMethod", options.VoiceMethod.ToString());
			if (options.VoiceFallbackUrl != null) request.AddParameter("VoiceFallbackUrl", options.VoiceFallbackUrl);
			if (options.VoiceFallbackMethod.HasValue()) request.AddParameter("VoiceFallbackMethod", options.VoiceFallbackMethod.ToString());
			if (options.VoiceCallerIdLookup.HasValue) request.AddParameter("VoiceCallerIdLookup", options.VoiceCallerIdLookup.Value);
			if (options.StatusCallback.HasValue()) request.AddParameter("StatusCallback", options.StatusCallback);
			if (options.StatusCallbackMethod.HasValue()) request.AddParameter("StatusCallbackMethod", options.StatusCallbackMethod.ToString());
		}
 /// <summary>
 /// Update the settings of an incoming phone number
 /// </summary>
 /// <param name="incomingPhoneNumberSid">The Sid of the phone number to update</param>
 /// <param name="options">Which settings to update. Only properties with values set will be updated.</param>
 public IAsyncOperation <IncomingPhoneNumber> UpdateIncomingPhoneNumberAsync(string incomingPhoneNumberSid, PhoneNumberOptions options)
 {
     return((IAsyncOperation <IncomingPhoneNumber>)AsyncInfo.Run((System.Threading.CancellationToken ct) => UpdateIncomingPhoneNumberAsyncInternal(incomingPhoneNumberSid, options)));
 }
		/// <summary>
		/// Update the settings of an incoming phone number
		/// </summary>
		/// <param name="incomingPhoneNumberSid">The Sid of the phone number to update</param>
		/// <param name="options">Which settings to update. Only properties with values set will be updated.</param>
        public virtual IncomingPhoneNumber UpdateIncomingPhoneNumber(string incomingPhoneNumberSid, PhoneNumberOptions options)
		{
			Require.Argument("IncomingPhoneNumberSid", incomingPhoneNumberSid);

			var request = new RestRequest(Method.POST);
			request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/{IncomingPhoneNumberSid}.json";
			
			request.AddParameter("IncomingPhoneNumberSid", incomingPhoneNumberSid, ParameterType.UrlSegment);
			AddPhoneNumberOptionsToRequest(request, options);
			AddSmsOptionsToRequest(request, options);

			return Execute<IncomingPhoneNumber>(request);
		}
 private void AddPhoneNumberOptionsToRequest(RestRequest request, PhoneNumberOptions options)
 {
     if (options.AreaCode.HasValue()) request.AddParameter("AreaCode", options.AreaCode);
     if (options.FriendlyName.HasValue())
     {
         Validate.IsValidLength(options.FriendlyName, 64);
         request.AddParameter("FriendlyName", options.FriendlyName);
     }
     if (options.VoiceUrl.HasValue()) request.AddParameter("VoiceUrl", options.VoiceUrl);
     if (options.VoiceMethod.HasValue) request.AddParameter("VoiceMethod", options.VoiceMethod.ToString());
     if (options.VoiceFallbackUrl.HasValue()) request.AddParameter("VoiceFallbackUrl", options.VoiceFallbackUrl);
     if (options.VoiceFallbackMethod.HasValue) request.AddParameter("VoiceFallbackMethod", options.VoiceFallbackMethod.ToString());
     if (options.VoiceCallerIdLookup.HasValue) request.AddParameter("VoiceCallerIdLookup", options.VoiceCallerIdLookup.Value);
     if (options.StatusCallbackUrl.HasValue()) request.AddParameter("StatusCallbackUrl", options.StatusCallbackUrl);
     if (options.StatusCallbackMethod.HasValue) request.AddParameter("StatusCallbackMethod", options.StatusCallbackMethod.ToString());
 }
 private void AddSmsOptionsToRequest(RestRequest request, PhoneNumberOptions options)
 {
     if (options.SmsUrl.HasValue()) request.AddParameter("SmsUrl", options.SmsUrl);
     if (options.SmsMethod.HasValue) request.AddParameter("SmsMethod", options.SmsMethod.ToString());
     if (options.SmsFallbackUrl.HasValue()) request.AddParameter("SmsFallbackUrl", options.SmsFallbackUrl);
     if (options.SmsFallbackMethod.HasValue) request.AddParameter("SmsFallbackMethod", options.SmsFallbackMethod.ToString());
 }
        /// <summary>
        /// Purchase/provision a toll free phone number
        /// </summary>
        /// <param name="options">Optional parameters to use when purchasing number</param>
        public virtual async Task <IncomingPhoneNumber> AddIncomingTollFreePhoneNumberAsync(PhoneNumberOptions options)
        {
            Require.Argument("PhoneNumber", options.PhoneNumber);

            var request = new RestRequest(Method.POST);

            request.Resource = "Accounts/{AccountSid}/IncomingPhoneNumbers/TollFree.json";

            //PhoneNumber is required for this resource
            request.AddParameter("PhoneNumber", options.PhoneNumber);

            AddPhoneNumberOptionsToRequest(request, options);
            AddSmsOptionsToRequest(request, options);

            return(await Execute <IncomingPhoneNumber>(request));
        }