Smart dereference automatically traverses the whole object when dereferencing. It should support a depth parameter that limits how deep traversal goes