implement push_self