code: public function produce($key,$params = array(),$enable_reflect = true){
          //if in data
          if(isset($this->data[$key])) return $this->data[$key];
          //if cached
          if(isset($this->caches[$key])) return $this->caches[$key];
          //if obj/closure
          if(isset($this->objects[$key])){
              $obj = $this->get($key);
              $concrete = $obj[self::INDEX_CONCRETE];
          }else{
              if($this->MUST_REG || !$enable_reflect){
                  throw new InjectorException("$key not registered");
              }else{
                  $concrete = $key;
                  $not_reg = true;
              }
          }
          $result = $this->build($concrete,$params);
          if($not_reg === true || $obj[self::INDEX_CACHED] === true){
              $this->caches[$key] = $result;
          }
          return $result;
      }
docs: produce a concrete
  @param $key
  @param $params
  @param bool $enable_reflect if $enable_reflect is true,it won't try to reflect for an unmapped concrete
  @return mixed|object
  @throws InjectorException