/**
 * @file Badge.h
 * @author apio (cloudapio.eu)
 * @brief A simple way to control who can call functions.
 *
 * @copyright Copyright (c) 2022-2023, the Luna authors.
 *
 */

#pragma once

/**
 * @brief A struct that can only be constructed by one type, used to control access to functions/methods.
 *
 * Example: There is a private method FooClass::foo() that you want to be callable by BarClass without making it a
 * friend.
 *
 * So, make FooClass::foo() public and make it take a Badge<BarClass> which will only be constructible by BarClass, thus
 * limiting the method even though it is public.
 *
 * @tparam T The type that can construct this badge.
 */
template <class T> struct Badge
{
  private:
    /**
     * @brief Construct a new Badge.
     *
     * This can only be done by the type T.
     */
    constexpr Badge() = default;

    Badge(const Badge<T>&) = delete;
    Badge(Badge<T>&&) = delete;

    friend T;
};