Modelling Dynamic Software Architectures using Typed Graph Grammars