shorter observer implementation