(function(root, factory) {
  if (typeof exports !== 'undefined') {
    return factory(root, exports, require('synapse/core'), require('backbone'));
  } else if (typeof define === 'function' && define.amd) {
    return define('synapse/backbone-model', ['synapse/core', 'backbone', 'exports'], function(core, Backbone, exports) {
      return factory(root, exports, core, Backbone);
    });
  } else {
    return root.BackboneModelHook = factory(root, {}, root.SynapseCore, root.Backbone);
  }
})(this, function(root, BackboneModelHook, core) {
  return {
    typeName: 'Backbone Model',
    checkObjectType: function(object) {
      return object instanceof Backbone.Model;
    },
    getHandler: function(object, key) {
      if (core.isFunction(object[key])) {
        return object[key]();
      } else {
        return object.get(key);
      }
    },
    setHandler: function(object, key, value) {
      var attrs;
      if (core.isFunction(object[key])) {
        return object[key](value);
      } else {
        attrs = {};
        attrs[key] = value;
        return object.set(attrs);
      }
    },
    onEventHandler: function(object, event, handler) {
      return object.bind(event, handler);
    },
    offEventHandler: function(object, event, handler) {
      return object.unbind(event, handler);
    },
    triggerEventHandler: function(object, event) {
      return object.trigger(event);
    },
    detectEvent: function(object, iface) {
      if (iface && !object[iface]) return "change:" + iface;
      return 'change';
    }
  };
});