protected function merge(User $target, User $source)
 {
     //module should throw Exception in case of merge is not possible
     $event = new Am_Event(Am_Event::USER_BEFORE_MERGE, array('target' => $target, 'source' => $source));
     $this->getDi()->hook->call(Am_Event::USER_BEFORE_MERGE, $event);
     $this->getDi()->db->query('UPDATE ?_access SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $this->getDi()->db->query('UPDATE ?_access_log SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $this->getDi()->db->query('UPDATE ?_invoice SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $this->getDi()->db->query('UPDATE ?_invoice_log SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $this->getDi()->db->query('UPDATE ?_invoice_payment SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $this->getDi()->db->query('UPDATE ?_invoice_refund SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     //        $this->getDi()->db->query('UPDATE ?_admin_log SET record_id=? WHERE record_id=?
     //            AND tablename=?',
     //            $target->pk(), $source->pk(), 'user');
     $this->getDi()->db->query('UPDATE ?_coupon_batch SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $this->getDi()->db->query('UPDATE ?_file_download SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $this->getDi()->db->query('UPDATE ?_upload SET user_id=? WHERE user_id=?', $target->pk(), $source->pk());
     $event = new Am_Event(Am_Event::USER_MERGE, array('target' => $target, 'source' => $source));
     $this->getDi()->hook->call(Am_Event::USER_MERGE, $event);
     $source->delete();
     $target->save();
     $target->checkSubscriptions(true);
 }