There are some people who know a great deal about GLSL, so I hope they come set the record straight, but based on what I've seen, you should be able to, in your fragment shader, do something like this (pseudocode, I'll leave the actual GLSL up to the people who know it better):
out vec4 fragment_color
vec4 final_color
final_color = flat_color
If this fragment is in shadow
final_color = shadow_color
If this fragment is an edge
final_color = edge_color
If this fragment is a highlight
final_color = highlight_color
fragment_color = final_color
By using ifs in this way, you get something like multiple passes. Does that make sense?
Edit: Also, hopefully this question on SOthis question on SO helps dispel some misunderstanding.