contract FootballerAccessControl{

  ///@dev Emited when contract is upgraded
  event ContractUpgrade(address newContract);
  //The address of manager (the account or contracts) that can execute action within the role.
  address public managerAddress;

  ///@dev keeps track whether the contract is paused.
  bool public paused = false;

  function FootballerAccessControl() public {
    managerAddress = msg.sender;
  }

  /// @dev Access modifier for manager-only functionality
  modifier onlyManager() {
    require(msg.sender == managerAddress);
    _;
  }

  ///@dev assigns a new address to act as the Manager.Only available to the current Manager.
  function setManager(address _newManager) external onlyManager {
    require(_newManager != address(0));
    managerAddress = _newManager;
  }

  /*** Pausable functionality adapted from OpenZeppelin ***/

  /// @dev Modifier to allow actions only when the contract IS NOT paused
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /// @dev Modifier to allow actions only when the contract IS paused
  modifier whenPaused {
      require(paused);
      _;
  }

  /// @dev Called by manager to pause the contract. Used only when
  ///  a bug or exploit is detected and we need to limit damage.
  function pause() external onlyManager whenNotPaused {
    paused = true;
  }

  /// @dev Unpauses the smart contract. Can only be called by the manager,
  /// since one reason we may pause the contract is when manager accounts are compromised.
  /// @notice This is public rather than external so it can be called by derived contracts.
  function unpause() public onlyManager {
    // can't unpause if contract was upgraded
    paused = false;
  }

}
function pause() external onlyManager whenNotPaused {
  paused = true;
}

/// @dev Called by manager to pause the contract. Used only when
///  a bug or exploit is detected and we need to limit damage.