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 `if`s in this way, you get something like multiple passes. Does that make sense?

_Edit:_ Also, hopefully [this question on SO](http://stackoverflow.com/questions/7235929/glsl-problem-multiple-shaders-in-one-program) helps dispel some misunderstanding.