implement basic AOP