change private to protected for better extensibility