implemented using properties