more extendable approach