func AscendGoal(child, parent string, lesson func() Lesson) {
	SetGoal(child, goalMap[parent])
	parentGoalMap[child] = &parentGoal{parent, lesson}
}
By default, GetTableName will use parent's table name.
package gogetter
import (
	"bitbucket.org/pkg/inflect"
	"errors"
	"fmt"
	"reflect"
	"strings"
	"sync"
)
type Dream interface{}
type Goal func() Dream
type Lesson map[string]Dream
type Database interface {
	Create(table string, data ...interface{}) (err error)
	Remove(table string, idField string, ids ...interface{}) (err error)
}
type GoGetter struct {
	dreams map[string][]Dream
	db     Database
}
func NewGoGetter(db Database) *GoGetter {
	return &GoGetter{
		db:     db,
		dreams: map[string][]Dream{},
	}
}
var ErrGetterNotExist = errors.New("Getter Not Exist")
var defaultGetter = NewGoGetter(nil)
var goalMap = map[string]Goal{}
var tableNameMap = map[string]string{}
func SetTableName(name, table string) {
	tableNameMap[name] = table
}
func GetTableName(name string) (table string, err error) {
	var ok bool
	table, ok = tableNameMap[name]
	if ok {
		return
	}
	if GetGoal(name) == nil {
		return "", ErrGetterNotExist
	}
	if pg, yes := parentGoalMap[name]; yes {
		table, err = GetTableName(pg.parent)
	} else {
		table = inflect.Pluralize(strings.ToLower(name))
		table = strings.Replace(table, " ", "_", -1)
	}
	tableNameMap[name] = table
	return
}
func SetGoal(name string, goal Goal) {
	goalMap[name] = goal
}
func GetGoal(name string) Goal {
	goal, ok := goalMap[name]
	if !ok {
		return nil
	}
	return goal
}
func SetDefaultGetterDb(db Database) {
	defaultGetter.db = db
}
type parentGoal struct {
	parent string
	lesson func() Lesson
}
var parentGoalMap = map[string]*parentGoal{}