public function cron_callback( $hash ) {

		$notifications = $this->storage->get_notifications( $hash );

		if ( empty( $notifications ) ) {
			return;
		}

		$strategy = $this->storage->get_notifications_strategy( $hash );

		$rate = $strategy->get_suggested_rate();

		if ( count( $notifications ) > $rate ) {
			$to_process = array_slice( $notifications, 0, $rate, true );
		} else {
			$to_process = $notifications;
		}

		/**
		 * @var Contract $notification
		 */
		foreach ( $to_process as $key => $notification ) {

			/*
			 * On the off chance that we timeout while processing the notifications,
			 * double check that this notification hasn't already been sent.
			 */
			if ( $notification->was_sent() ) {
				unset( $notifications[ $key ] );

				continue;
			}

			try {

				$notification->set_strategy( $strategy );

				if ( $notification->send() ) {
					unset( $notifications[ $key ] );
				}

			}
			catch ( \Exception $e ) {

			}
		}

		if ( empty( $notifications ) ) {
			$this->storage->clear_notifications( $hash );
		} else {
			$this->storage->store_notifications( $hash, $notifications );

			// we pass along a garbage uniquid to prevent WP Cron from denying our event since it is less than 10 minutes since the last
			wp_schedule_single_event( self::get_next_event_time(), self::CRON_ACTION, array( $hash, uniqid() ) );
		}
	}