code: function(product, productType, appearance, options, callback) {
                  if (options instanceof Function) {
                      callback = options;
                      options = null;
                  } else if (appearance instanceof Function) {
                      callback = appearance;
                      appearance = null;
                  }
  
                  var self = this,
                      view;
  
                  if (product.get("productType.id") != productType.get("id")) {
                      product.removeExampleConfiguration();
                  }
  
                  flow()
                      .seq(function(cb) {
                          productType.fetch(null, cb);
                      })
                      .seq(function() {
                          if (!appearance) {
                              if (product.$.appearance) {
                                  appearance = productType.getClosestAppearance(product.$.appearance.getMainColor());
                              } else {
                                  appearance = productType.getDefaultAppearance();
                              }
                          }
                      })
                      .seq(function() {
                          var currentView = product.$.view;
  
                          if (currentView) {
                              view = productType.getViewByPerspective(currentView.$.perspective);
                          }
  
                          if (!view) {
                              view = productType.getDefaultView();
                          }
  
                      })
                      .seq('removedConfigurations', function() {
                          options = options || {};
                          options.allowPrintAreaChange = true;
                          options.respectTransform = true;
                          return self.convertConfigurations(product, productType, appearance, options);
                      })
                      .seq(function() {
                          // first set product type
                          // and then the appearance, because appearance depends on product type
                          product.set({
                              productType: productType,
                              view: view,
                              appearance: appearance
                          });
  
                          self.$.bus.trigger('Application.productChanged', product);
                      })
                      .exec(callback);
  
              }
docs: *
  set the product type and converts all configurations
  
  @param {sprd.model.Product} product
  @param {sprd.model.ProductType} productType
  @param {sprd.entity.Appearance} appearance
  @param callback