This paper reports on our work developing programming techniques that make it possible to clearly express those programs that OOP fails to support. We present an analysis of why some design decisions have been so difficult to cleanly capture in actual code. We call the issues these decisions address ASPECTS, and say that the reason they have been hard to capture is that they CROSS-CUT the system's basic functionality. We present the basis for a new programming technique, called aspect-oriented programming (AOP), that makes it possible to clearly express programs involving such aspects, including appropriate isolation, composition and reuse of the aspect code. The discussion is rooted in systems we have built using aspect-oriented programming.