do not use $self for callbacks