updated with annotations and AOP