text: "use strict";
  /* jshint newcap:false */
  
  var BaseState = require("./State");
  var BaseComponent = require("./Component");
  var inherit = require("raptor-util/inherit");
  
  module.exports = function defineComponent(def, renderer) {
    if (def.___isComponent) {
      return def;
    }
  
    var ComponentClass = function () {};
    var proto;
  
    var type = typeof def;
  
    if (type == "function") {
      proto = def.prototype;
    } else if (type == "object") {
      proto = def;
    } else {
      throw TypeError();
    }
  
    ComponentClass.prototype = proto;
  
    // We don't use the constructor provided by the user
    // since we don't invoke their constructor until
    // we have had a chance to do our own initialization.
    // Instead, we store their constructor in the "initComponent"
    // property and that method gets called later inside
    // init-components-browser.js
    function Component(id) {
      BaseComponent.call(this, id);
    }
  
    if (!proto.___isComponent) {
      // Inherit from Component if they didn't already
      inherit(ComponentClass, BaseComponent);
    }
  
    // The same prototype will be used by our constructor after
    // we he have set up the prototype chain using the inherit function
    proto = Component.prototype = ComponentClass.prototype;
  
    // proto.constructor = def.constructor = Component;
  
    // Set a flag on the constructor function to make it clear this is
    // a component so that we can short-circuit this work later
    Component.___isComponent = true;
  
    function State(component) {
      BaseState.call(this, component);
    }
    inherit(State, BaseState);
    proto.___State = State;
    proto.___renderer = renderer;
  
    return Component;
  };
  