a cleaner design, avoid circular references