better default implementation