public static function theProcessor()
 {
     if (!isset(self::$theProcessor)) {
         self::$theProcessor = new self(Samurai::$processorToken);
     }
     return self::$theProcessor;
 }
function samurai_capture($params)
{
    global $CONFIG;
    $setup = Samurai::setup(array('sandbox' => $params['testMode'], 'merchantKey' => $params['merchantKey'], 'merchantPassword' => $params['merchantPass'], 'processorToken' => $params['procToken']));
    $clientid = $params['clientdetails']['userid'];
    $gatewayid = $params['gatewayid'];
    $companyName = $CONFIG['CompanyName'];
    $payMethod = Samurai_PaymentMethod::find($gatewayid);
    if (!$payMethod->hasErrors()) {
        $processor = Samurai_Processor::theProcessor();
        $purchase = $processor->purchase($payMethod->token, $params['amount'], array('billing_reference' => $params['invoiceid'], 'customer_reference' => $clientid, 'description' => $params['description'], 'descriptor_name' => $companyName, 'custom' => 'Samurai WHMCS Module'));
        if ($purchase->isSuccess()) {
            $refid = $purchase->attributes['reference_id'];
            return array('status' => 'success', 'transid' => $refid);
        } else {
            $allerrors = "This transaction could not be processed:\n";
            foreach ($purchase->errors as $context => $errors) {
                foreach ($errors as $error) {
                    $allerrors .= $error->description . "\n";
                }
            }
            return array('status' => 'error', 'rawdata' => $allerrors);
        }
    } else {
        $allerrors = "This transaction could not be processed:\n";
        foreach ($payMethod->errors as $context => $errors) {
            foreach ($errors as $error) {
                $allerrors .= $error->description . "\n";
            }
        }
        return array('status' => 'error', 'rawdata' => $allerrors);
    }
}