Описание процессов биллинга общепринятыми терминами и ООП стало главной идей абстракции. Библиотека писалась под предметную область хостинг-компании, но реализация довольно абстрактна, чтобы ее можно было применить в другой предметной области. Ниже вкратце описаны идеи этой библиотеки:

Plan

Тарифный план - собирательная сущность, которая включает в себя набор цен (Price) и служит для порождения операций (Charge) для событий (Action).

Price

Price - информационная единица, которая содержит стоимость и тип, который он представляет. В нашей предметной области Price бывает поштучный (Single) или из списка (Enum).  Например, Plan для доменных имён мог бы содержать два Price: по одному для операций типа "покупка домена" и "продление домена".

Action

Action - объект или событие, которое может быть оплачено. Допустим, мы хотим купить домен example.com. Для этого мы создаём событие (Action) с данными о цели (action.target = Domain(example.com)), устанавливаем тип "покупка домена" (action.type) и срок регистрации (action.quantity) в один год. Используя Plan::calculateCharges(), можно получить массив списаний (Charge) для этого события.

Order

Часто покупка - цельная операция, которая состоит из множества товаров или услуг (Action). Order - аггрегирующая сущность для объединения Action в единое целое.

Charge

Класс представляет непосредственно списание средств как результат события (Action), и связан с тарифом и клиентом.

Bill

Списания объединяются в платежи.

Calculator

Собирает все списания, необходимые для обработки конкретного заказа (Order).

Sale/Subscription

Продажа (или подписка) представляет привязку клиента к купленной услуге по такому-то тарифу. Также может хранить другие данные описывающие конкрентную продажу: например дату окончания услуги.