contract Ownership {
    address private _owner;
    
    event OwnerOwnershipTransferred(address indexed prevOwner, address indexed newOwner);
    
    // Returns contract owner address
    function owner() public view returns (address){
        return _owner;
    }
    
    // Check if caller is owner account
    function isOwner() public view returns (bool){
        return (msg.sender == _owner);
    }
    
    // Modifier for function restricted to owner only
    modifier onlyOwner() {
        require(isOwner(), "Ownership: the caller is not the owner address");
        _;
    }
    
    // Transfer owner's ownership to new address
    // # param newOwner: address of new owner to be transferred
    function transferOwnerOwnership(address newOwner) public onlyOwner {
        _transferOwnerOwnership(newOwner);
    }
    
    // ==== internal functions ====

    function _transferOwnerOwnership(address newOwner) internal {
        require (newOwner != address(0), "Ownable: new owner is zero address");
        emit OwnerOwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    
    function _setupOwnership(address own) internal {
        require (own != address(0), "Ownable: owner is zero address");
        _owner = own;
        
        emit OwnerOwnershipTransferred(address(0), own);
    }
}
//import "./ERC223ReceivingContract.sol";
//  Ownership contract
//  - token contract ownership for owner & lockup addresses
function _transferOwnerOwnership(address newOwner) internal {
    require (newOwner != address(0), "Ownable: new owner is zero address");
    emit OwnerOwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
}

// ==== internal functions ====