abstract model