def move_asset_ahead(self, asset_id, composition_id, reference_id):
        """Reorders assets in a composition by moving the specified asset in front of a reference asset.

        arg:    asset_id (osid.id.Id): ``Id`` of the ``Asset``
        arg:    composition_id (osid.id.Id): ``Id`` of the
                ``Composition``
        arg:    reference_id (osid.id.Id): ``Id`` of the reference
                ``Asset``
        raise:  NotFound - ``asset_id`` or ``reference_id``  ``not found
                in composition_id``
        raise:  NullArgument - ``asset_id, reference_id`` or
                ``composition_id`` is ``null``
        raise:  OperationFailed - unable to complete request
        raise:  PermissionDenied - authorization fauilure
        *compliance: mandatory -- This method must be implemented.*

        """
        if (not isinstance(composition_id, ABCId) and
                composition_id.get_identifier_namespace() != 'repository.Composition'):
            raise errors.InvalidArgument('the argument is not a valid OSID Id')
        composition_map, collection = self._get_composition_collection(composition_id)
        composition_map['assetIds'] = move_id_ahead(asset_id, reference_id, composition_map['assetIds'])
        collection.save(composition_map)