Modularizing Crosscutting Concerns in Software