docs: def get_attr(obj, attr, default=None):
      """Recursive get object's attribute. May use dot notation.
  
      >>> class C(object): pass
      >>> a = C()
      >>> a.b = C()
      >>> a.b.c = 4
      >>> get_attr(a, 'b.c')
      4
  
      >>> get_attr(a, 'b.c.y', None)
  
      >>> get_attr(a, 'b.c.y', 1)
      1
      """
      if '.' not in attr:
          return getattr(obj, attr, default)
      else:
          L = attr.split('.')
          return get_attr(getattr(obj, L[0], default), '.'.join(L[1:]), default)