<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _handle_crud_like_event( 	target_cls, 	event, 	data=None, 	verb=None, 	id=None, 	customer=None, 	crud_type=None, 	crud_exact=False, 	crud_valid=False, ):
 	""" 	Helper to process crud_type-like events for objects. 	Non-deletes (creates, updates and "anything else" events) are treated as 	update_or_create events - The object will be retrieved locally, then it is 	synchronised with the Stripe API for parity. 	Deletes only occur for delete events and cause the object to be deleted 	from the local database, if it existed. If it doesn't exist then it is 	ignored (but the event processing still succeeds). 	:param target_cls: The djstripe model being handled. 	:type: ``djstripe.models.StripeObject`` 	:param data: The event object data (defaults to ``event.data``). 	:param verb: The event verb (defaults to ``event.verb``). 	:param id: The object Stripe ID (defaults to ``object.id``). 	:param customer: The customer object (defaults to ``event.customer``). 	:param crud_type: The CrudType object (determined by default). 	:param crud_exact: If True, match verb against CRUD type exactly. 	:param crud_valid: If True, CRUD type must match valid type. 	:returns: The object (if any) and the event CrudType. 	:rtype: ``tuple(obj, CrudType)`` 	"""

	data = data or event.data
	id = id or data.get("object", {}).get("id", None)

	if not id:
		# We require an object when applying CRUD-like events, so if there's
		# no ID the event is ignored/dropped. This happens in events such as
		# invoice.upcoming, which refer to a future (non-existant) invoice.
		logger.debug("Ignoring %r Stripe event without object ID: %r", event.type, event)
		return

	verb = verb or event.verb
	customer = customer or event.customer
	crud_type = crud_type or CrudType.determine(event=event, verb=verb, exact=crud_exact)
	obj = None

	if crud_valid and not crud_type.valid:
		logger.debug(
			"Ignoring %r Stripe event without valid CRUD type: %r", event.type, event
		)
		return

	if crud_type.deleted:
		qs = target_cls.objects.filter(id=id)
		if target_cls is models.Customer and qs.exists():
			qs.get().purge()
		else:
			obj = target_cls.objects.filter(id=id).delete()
	else:
		# Any other event type (creates, updates, etc.) - This can apply to
		# verbs that aren't strictly CRUD but Stripe do intend an update.  Such
		# as invoice.payment_failed.
		kwargs = {"id": id}
		if hasattr(target_cls, "customer"):
			kwargs["customer"] = customer
		data = target_cls(**kwargs).api_retrieve()
		obj = target_cls.sync_from_stripe_data(data)

	return obj, crud_type