func (p *Parameter) DiscoverProperties(tag reflect.StructTag) error {
	if len(tag) > 0 {
		paramtype := reflect.TypeOf((*Parameter)(nil))
		prefix := "Tag"
		paramvalue := reflect.ValueOf(p)

		for idx := 0; idx < paramtype.NumMethod(); idx++ {
			method := paramtype.Method(idx)
			if !strings.HasPrefix(method.Name, prefix) {
				continue
			}

			tagname := "klash-" + strings.ToLower(method.Name[len(prefix):])
			if tagval := tag.Get(tagname); tagval != "" {
				methodValue := paramvalue.MethodByName(method.Name)

				err := methodValue.Call([]reflect.Value{reflect.ValueOf(tagval)})[0].Interface()
				if err != nil {
					return (err).(error)
				}
			}
		}
	}
	return nil
}
func (p *Parameter) DiscoverProperties(tag reflect.StructTag) error {
	if len(tag) > 0 {
		paramtype := reflect.TypeOf((*Parameter)(nil))
		prefix := "Tag"
		paramvalue := reflect.ValueOf(p)

		for idx := 0; idx < paramtype.NumMethod(); idx++ {
			method := paramtype.Method(idx)
			if !strings.HasPrefix(method.Name, prefix) {
				continue
			}

			tagname := "klash-" + strings.ToLower(method.Name[len(prefix):])
			if tagval := tag.Get(tagname); tagval != "" {
				methodValue := paramvalue.MethodByName(method.Name)

				err := methodValue.Call([]reflect.Value{reflect.ValueOf(tagval)})[0].Interface()
				if err != nil {
					return (err).(error)
				}
			}
		}
	}
	return nil
}
// List through all Tag-related (i.e starting with Tag) method of the Parameter type
// and execute them.