code: func BindFields(obj interface{}) Fields {
  	t := reflect.TypeOf(obj)
  	v := reflect.ValueOf(obj)
  	fields := make(map[string]*Field)
  
  	if t.Kind() == reflect.Ptr {
  		t = t.Elem()
  		v = v.Elem()
  	}
  
  	for i := 0; i < t.NumField(); i++ {
  		field := t.Field(i)
  
  		tag := extractTag(field.Tag)
  		if tag == "-" {
  			continue
  		}
  
  		fieldType := field.Type
  
  		if fieldType.Kind() == reflect.Ptr {
  			fieldType = fieldType.Elem()
  		}
  
  		var graphType Output
  		if fieldType.Kind() == reflect.Struct {
  			structFields := BindFields(v.Field(i).Interface())
  
  			if tag == "" {
  				fields = appendFields(fields, structFields)
  				continue
  			} else {
  				graphType = NewObject(ObjectConfig{
  					Name:   tag,
  					Fields: structFields,
  				})
  			}
  		}
  
  		if tag == "" {
  			continue
  		}
  
  		if graphType == nil {
  			graphType = getGraphType(fieldType)
  		}
  		fields[tag] = &Field{
  			Type: graphType,
  			Resolve: func(p ResolveParams) (interface{}, error) {
  				return extractValue(tag, p.Source), nil
  			},
  		}
  	}
  	return fields
  }
docs: // can't take recursive slice type
  // e.g
  // type Person struct{
  //	Friends []Person
  // }
  // it will throw panic stack-overflow