John Lam has written a cross-language "weaver" for adding aspects (as in aspect-oriented programming) into .NET languages. Aspects allow one to compose behavior based on the method signature of a target program. In that sense, they're similar to .NET's native attributes. The difference is that attribute behavior is restricted to programs that interpret that attribute, while aspects inject the behavior into the flow of an existing program. Thus, with attributes, programs like NUnit 2.0 can say "Which methods in this assembly are marked as test methods? Okay, call them all." While with attributes, one can say "Generate trace output for every method call that returns an integer." See my September 2001 review of AspectJ in Software Development (although note that I didn't write that it was "the first aspect-oriented compiler," which I believe is incorrect).