implement event decorator