interface itop { in void e(); out void f(); behaviour { on e: f; } } interface imiddle { in void e(); out void f(); behaviour { on e: f; } } interface ibottom { in void e(); out void f(); behaviour { on e: f; } } interface ilogger { in void log(); behaviour { on log:{} } } component logger { provides ilogger log; behaviour { on log.log(): {} } } component middle { provides itop t; requires ibottom b; requires injected ilogger l; behaviour { on t.e(): {l.log(); b.e();} on b.f(): {l.log(); t.f();} } } component bottom { provides ibottom b; behaviour { on b.e(): b.f(); } } component Injected { provides itop t; system { logger l; middle m; bottom b; m.t <=> t; m.b <=> b.b; l.log <=> *; } }