I have done this by altering the 'page callback' for the path and then checking for the user role in the callback function. I am not sure if this is the best way to go about it.
function mymodule_hook_alter(&$items) {
// change callback for user view page to our dashboard function
$items['user/%user']['page callback'] = '_client_dashboard';
}
/**
* Callback function for menu item user/%
*/
function _client_dashboard($account) {
global $user;
// since we override user.module page callback for user/%user
// perform default function for users without client role
if(!in_array('client', $user->roles)) {
// return the function used by user.module passing in account
return user_view_page($account);
}
return t('Dashboard');
}
I know you cannot have logic in hook_menu_alter since it's only called when caches cleared and stored in routing table.