code: func Pcall(method reflect.Method, args []reflect.Value) (rets interface{}, err error) {
  	defer func() {
  		if rec := recover(); rec != nil {
  			// Try to use logger from context here to help trace error cause
  			log := getLoggerFromArgs(args)
  			log.Errorf("panic - pitaya/dispatch: %s: %v", method.Name, rec)
  			log.Debugf("%s", debug.Stack())
  			if s, ok := rec.(string); ok {
  				err = errors.New(s)
  			} else {
  				err = fmt.Errorf("rpc call internal error - %s: %v", method.Name, rec)
  			}
  		}
  	}()
  
  	r := method.Func.Call(args)
  	// r can have 0 length in case of notify handlers
  	// otherwise it will have 2 outputs: an interface and an error
  	if len(r) == 2 {
  		if v := r[1].Interface(); v != nil {
  			err = v.(error)
  		} else if !r[0].IsNil() {
  			rets = r[0].Interface()
  		} else {
  			err = constants.ErrReplyShouldBeNotNull
  		}
  	}
  	return
  }
docs: // Pcall calls a method that returns an interface and an error and recovers in case of panic