Implementing aspect-oriented programming with interceptors