protected function isRelation(Model $instance, $key, $model_class)
	{
		// Not a relation method
		if (! method_exists($instance, $key)) {
			return false;
		}

		$relation      = null;
		$safe_instance = new $model_class;

		// Get method, dirty and imperfect
		$reflected_method = (new \ReflectionMethod($safe_instance, $key))->__toString();

		$supported_relations = [
			BelongsTo::class,
			HasOne::class,
			HasMany::class,
			BelongsToMany::class,
		];

		// Find which, if any, of the supported relations are present in the reflected string
		foreach ($supported_relations as $supported_relation) {
			if (strpos($reflected_method, $supported_relation) !== false) {
				$relation = $instance->$key();
				break;
			}
		}

		// If the ReflectionMethod guess fails, try to guess based on the concrete return type of a safe instance
		// of the model
		if (is_null($relation) && ($safe_instance->$key() instanceof Relation)) {
			// If the method returns a Relation, we can safely call it
			$relation = $instance->$key();
		}

		return is_null($relation) ? false : $relation;
	}