public StripeObject CreateCharge(decimal amount, string currency, string customerId, string description = null, IDictionary<string, object> metadata = null)
        {
            Require.Argument("amount", amount);
            Require.Argument("currency", currency);
            Require.Argument("customerId", customerId);

            if (amount < 0.5M)
                throw new ArgumentOutOfRangeException("amount", amount, "Amount must be at least 50 cents");

            var request = new RestRequest();
            request.Method = Method.POST;
            request.Resource = "charges";

            request.AddParameter("amount", Convert.ToInt32(amount * 100M));
            request.AddParameter("currency", currency);
            request.AddParameter("customer", customerId);
            if (description.HasValue()) request.AddParameter("description", description);

            request.WithMetadata(metadata);

            return ExecuteObject(request);
        }