can't you call a private check_form method from your public route ?
Edit : My Bad... didn't see you asked for custom validation method. Your can create a form_validation_helper
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
function city_check($postfield){
global $CI;
if ($postfield == '0'){
$CI->form_validation->set_message('city_check', 'Need city');
return FALSE;
}else{
return TRUE;
}
}
// in your controller
$this->load->helper('form_validation');
$this->form_validation->set_rules('email', 'Email', 'callback_city_check' );