deleted old (and slow) implementation
refactoring : pull up common methods to abstract superclass