contract TransferHandlerRegistry is Ownable {
  event AddTransferHandler(
    bytes4 kind,
    address contractAddress
  );
  // Mapping of bytes4 to contract interface type
  mapping (bytes4 => ITransferHandler) public transferHandlers;
  /**
  * @notice Adds handler to mapping
  * @param kind bytes4 Key value that defines a token type
  * @param transferHandler ITransferHandler
  */
  function addTransferHandler(bytes4 kind, ITransferHandler transferHandler)
    external onlyOwner {
      require(address(transferHandlers[kind]) == address(0), "HANDLER_EXISTS_FOR_KIND");
      transferHandlers[kind] = transferHandler;
      emit AddTransferHandler(kind, address(transferHandler));
    }
}
/**
 * @title TransferHandlerRegistry: holds registry of contract to
 * facilitate token transfers
 */
function addTransferHandler(bytes4 kind, ITransferHandler transferHandler)
  external onlyOwner {
    require(address(transferHandlers[kind]) == address(0), "HANDLER_EXISTS_FOR_KIND");
    transferHandlers[kind] = transferHandler;
    emit AddTransferHandler(kind, address(transferHandler));
  }

/**
 * @notice Adds handler to mapping
 * @param kind bytes4 Key value that defines a token type
 * @param transferHandler ITransferHandler
 */