refactor appenable for better extensibility