PROCESSING A PAYMENT
--------------------
The payment workflow consists of objects of several classes, and constants. The
API-related classes are located in payment/payment.classes.inc and constants
are defined in payment/payment.module.

To process a payment, you will need to create a Payment object and set the
necessary properties, such as:
- A PaymentMethod object in Payment::method, which in turn has a
  PaymentMethodController object in PaymentMethod::controller.
- One or more PaymentLineItem objects in Payment::line_items, keyed by
  PaymentLineItem::name. See Payment::setLineItem().
- One or more PaymentStatusItem objects in Payment::statuses, which can be set
  through Payment::setStatus().
Once this is completed, call $payment->execute(). If the payment and its
payment are valid (they can work together), the payment will be executed. You
should do nothing important after payment execution, because the payment method
is allowed to redirect the user off-site. Instead, payment post-processing
should happen in Payment::finish_callback. Right after you call
Payment::execute() you can, for instance, rebuild your payment form if
execution failed and the user was not redirected. If the payment method did
redirect the user, your finish callback will need to take care of this.

PAYMENT STATUSES
----------------
Payment statuses are strings and are exposed in hook_payment_status_info() as
PaymentStatusInfo objects that contain metadata such as relationships with
other payment statuses and human-readable information.

For payments they are used as PaymentStatusItem objects, which contain extra
information with respect to the particular payment they belong to, such as the
datetime at which they were set.

PAYMENT LINE ITEMS
--------------
Payment line item types are exposed in hook_payment_line_item_info() as
PaymentLineItemInfo objects that contain metadata such as human-readable
information and settings needed to get line items from Payment objects.
Using a custom callback, multiple line items can be retrieved from a payment
using the same machine name. See payment_payment_line_item_info(), the line
item type "payment_all" defined there and its callback
payment_line_item_get_all() for an example.

For payments you'll have to use PaymentLineItem objects, which contain extra
information with respect to the particular payment they belong to, such as a
human-readable description.

Note that there does not have to be a 1:1 relationship between
PaymentLineItem and PaymentLineItemInfo objects. A machine name used for a
PaymentLineItem object does not necessarily have to be defined in
hook_payment_line_item_info(), either because it can be retrieved by another
line item type defined there, or because it should not be retrieved at
all.
