requires 'self'