<?php

namespace Kanboard\Core;

use Pimple\Container;

/**
 * Base Class
 *
 * @package Kanboard\Core
 * @author  Frederic Guillot
 *
 * @property \Kanboard\Analytic\TaskDistributionAnalytic             $taskDistributionAnalytic
 * @property \Kanboard\Analytic\UserDistributionAnalytic             $userDistributionAnalytic
 * @property \Kanboard\Analytic\EstimatedTimeComparisonAnalytic      $estimatedTimeComparisonAnalytic
 * @property \Kanboard\Analytic\AverageLeadCycleTimeAnalytic         $averageLeadCycleTimeAnalytic
 * @property \Kanboard\Analytic\AverageTimeSpentColumnAnalytic       $averageTimeSpentColumnAnalytic
 * @property \Kanboard\Analytic\EstimatedActualColumnAnalytic        $estimatedActualColumnAnalytic
 * @property \Kanboard\Core\Action\ActionManager                     $actionManager
 * @property \Kanboard\Core\ExternalLink\ExternalLinkManager         $externalLinkManager
 * @property \Kanboard\Core\ExternalTask\ExternalTaskManager         $externalTaskManager
 * @property \Kanboard\Core\Cache\MemoryCache                        $memoryCache
 * @property \Kanboard\Core\Cache\BaseCache                          $cacheDriver
 * @property \Kanboard\Core\Event\EventManager                       $eventManager
 * @property \Kanboard\Core\Group\GroupManager                       $groupManager
 * @property \Kanboard\Core\User\UserManager                         $userManager
 * @property \Kanboard\Core\Http\Client                              $httpClient
 * @property \Kanboard\Core\Http\OAuth2                              $oauth
 * @property \Kanboard\Core\Http\RememberMeCookie                    $rememberMeCookie
 * @property \Kanboard\Core\Http\Request                             $request
 * @property \Kanboard\Core\Http\Response                            $response
 * @property \Kanboard\Core\Http\Router                              $router
 * @property \Kanboard\Core\Http\Route                               $route
 * @property \Kanboard\Core\Queue\QueueManager                       $queueManager
 * @property \Kanboard\Core\Mail\Client                              $emailClient
 * @property \Kanboard\Core\ObjectStorage\ObjectStorageInterface     $objectStorage
 * @property \Kanboard\Core\Plugin\Hook                              $hook
 * @property \Kanboard\Core\Plugin\Loader                            $pluginLoader
 * @property \Kanboard\Core\Security\AuthenticationManager           $authenticationManager
 * @property \Kanboard\Core\Security\AccessMap                       $applicationAccessMap
 * @property \Kanboard\Core\Security\AccessMap                       $projectAccessMap
 * @property \Kanboard\Core\Security\AccessMap                       $apiAccessMap
 * @property \Kanboard\Core\Security\AccessMap                       $apiProjectAccessMap
 * @property \Kanboard\Core\Security\Authorization                   $applicationAuthorization
 * @property \Kanboard\Core\Security\Authorization                   $projectAuthorization
 * @property \Kanboard\Core\Security\Authorization                   $apiAuthorization
 * @property \Kanboard\Core\Security\Authorization                   $apiProjectAuthorization
 * @property \Kanboard\Core\Security\Role                            $role
 * @property \Kanboard\Core\Security\Token                           $token
 * @property \Kanboard\Core\Session\FlashMessage                     $flash
 * @property \Kanboard\Core\Session\SessionManager                   $sessionManager
 * @property \Kanboard\Core\User\Avatar\AvatarManager                $avatarManager
 * @property \Kanboard\Core\User\GroupSync                           $groupSync
 * @property \Kanboard\Core\User\UserProfile                         $userProfile
 * @property \Kanboard\Core\User\UserSync                            $userSync
 * @property \Kanboard\Core\User\UserSession                         $userSession
 * @property \Kanboard\Core\DateParser                               $dateParser
 * @property \Kanboard\Core\Helper                                   $helper
 * @property \Kanboard\Core\Paginator                                $paginator
 * @property \Kanboard\Core\Template                                 $template
 * @property \Kanboard\Decorator\MetadataCacheDecorator              $userMetadataCacheDecorator
 * @property \Kanboard\Decorator\UserCacheDecorator                  $userCacheDecorator
 * @property \Kanboard\Decorator\ColumnRestrictionCacheDecorator     $columnRestrictionCacheDecorator
 * @property \Kanboard\Decorator\ColumnMoveRestrictionCacheDecorator $columnMoveRestrictionCacheDecorator
 * @property \Kanboard\Decorator\ProjectRoleRestrictionCacheDecorator $projectRoleRestrictionCacheDecorator
 * @property \Kanboard\Formatter\BoardColumnFormatter                $boardColumnFormatter
 * @property \Kanboard\Formatter\BoardFormatter                      $boardFormatter
 * @property \Kanboard\Formatter\BoardSwimlaneFormatter              $boardSwimlaneFormatter
 * @property \Kanboard\Formatter\BoardTaskFormatter                  $boardTaskFormatter
 * @property \Kanboard\Formatter\GroupAutoCompleteFormatter          $groupAutoCompleteFormatter
 * @property \Kanboard\Formatter\ProjectActivityEventFormatter       $projectActivityEventFormatter
 * @property \Kanboard\Formatter\ProjectApiFormatter                 $projectApiFormatter
 * @property \Kanboard\Formatter\ProjectsApiFormatter                $projectsApiFormatter
 * @property \Kanboard\Formatter\SubtaskListFormatter                $subtaskListFormatter
 * @property \Kanboard\Formatter\SubtaskTimeTrackingCalendarFormatter $subtaskTimeTrackingCalendarFormatter
 * @property \Kanboard\Formatter\TaskApiFormatter                    $taskApiFormatter
 * @property \Kanboard\Formatter\TasksApiFormatter                   $tasksApiFormatter
 * @property \Kanboard\Formatter\TaskAutoCompleteFormatter           $taskAutoCompleteFormatter
 * @property \Kanboard\Formatter\TaskICalFormatter                   $taskICalFormatter
 * @property \Kanboard\Formatter\TaskListFormatter                   $taskListFormatter
 * @property \Kanboard\Formatter\TaskListSubtaskFormatter            $taskListSubtaskFormatter
 * @property \Kanboard\Formatter\TaskListSubtaskAssigneeFormatter    $taskListSubtaskAssigneeFormatter
 * @property \Kanboard\Formatter\TaskSuggestMenuFormatter            $taskSuggestMenuFormatter
 * @property \Kanboard\Formatter\UserAutoCompleteFormatter           $userAutoCompleteFormatter
 * @property \Kanboard\Formatter\UserMentionFormatter                $userMentionFormatter
 * @property \Kanboard\Model\ActionModel                             $actionModel
 * @property \Kanboard\Model\ActionParameterModel                    $actionParameterModel
 * @property \Kanboard\Model\AvatarFileModel                         $avatarFileModel
 * @property \Kanboard\Model\BoardModel                              $boardModel
 * @property \Kanboard\Model\CaptchaModel                            $captchaModel
 * @property \Kanboard\Model\CategoryModel                           $categoryModel
 * @property \Kanboard\Model\ColorModel                              $colorModel
 * @property \Kanboard\Model\ColumnModel                             $columnModel
 * @property \Kanboard\Model\ColumnRestrictionModel                  $columnRestrictionModel
 * @property \Kanboard\Model\ColumnMoveRestrictionModel              $columnMoveRestrictionModel
 * @property \Kanboard\Model\CommentModel                            $commentModel
 * @property \Kanboard\Model\ConfigModel                             $configModel
 * @property \Kanboard\Model\CurrencyModel                           $currencyModel
 * @property \Kanboard\Model\CustomFilterModel                       $customFilterModel
 * @property \Kanboard\Model\TaskFileModel                           $taskFileModel
 * @property \Kanboard\Model\ProjectFileModel                        $projectFileModel
 * @property \Kanboard\Model\GroupModel                              $groupModel
 * @property \Kanboard\Model\GroupMemberModel                        $groupMemberModel
 * @property \Kanboard\Model\InviteModel                             $inviteModel
 * @property \Kanboard\Model\LanguageModel                           $languageModel
 * @property \Kanboard\Model\LastLoginModel                          $lastLoginModel
 * @property \Kanboard\Model\LinkModel                               $linkModel
 * @property \Kanboard\Model\NotificationModel                       $notificationModel
 * @property \Kanboard\Model\PasswordResetModel                      $passwordResetModel
 * @property \Kanboard\Model\PredefinedTaskDescriptionModel          $predefinedTaskDescriptionModel
 * @property \Kanboard\Model\ProjectModel                            $projectModel
 * @property \Kanboard\Model\ProjectActivityModel                    $projectActivityModel
 * @property \Kanboard\Model\ProjectDuplicationModel                 $projectDuplicationModel
 * @property \Kanboard\Model\ProjectDailyColumnStatsModel            $projectDailyColumnStatsModel
 * @property \Kanboard\Model\ProjectDailyStatsModel                  $projectDailyStatsModel
 * @property \Kanboard\Model\ProjectMetadataModel                    $projectMetadataModel
 * @property \Kanboard\Model\ProjectPermissionModel                  $projectPermissionModel
 * @property \Kanboard\Model\ProjectUserRoleModel                    $projectUserRoleModel
 * @property \Kanboard\Model\ProjectGroupRoleModel                   $projectGroupRoleModel
 * @property \Kanboard\Model\ProjectNotificationModel                $projectNotificationModel
 * @property \Kanboard\Model\ProjectNotificationTypeModel            $projectNotificationTypeModel
 * @property \Kanboard\Model\ProjectRoleModel                        $projectRoleModel
 * @property \Kanboard\Model\ProjectRoleRestrictionModel             $projectRoleRestrictionModel
 * @property \Kanboard\Model\ProjectTaskDuplicationModel             $projectTaskDuplicationModel
 * @property \Kanboard\Model\ProjectTaskPriorityModel                $projectTaskPriorityModel
 * @property \Kanboard\Model\RememberMeSessionModel                  $rememberMeSessionModel
 * @property \Kanboard\Model\SubtaskModel                            $subtaskModel
 * @property \Kanboard\Model\SubtaskPositionModel                    $subtaskPositionModel
 * @property \Kanboard\Model\SubtaskStatusModel                      $subtaskStatusModel
 * @property \Kanboard\Model\SubtaskTaskConversionModel              $subtaskTaskConversionModel
 * @property \Kanboard\Model\SubtaskTimeTrackingModel                $subtaskTimeTrackingModel
 * @property \Kanboard\Model\SwimlaneModel                           $swimlaneModel
 * @property \Kanboard\Model\TagDuplicationModel                     $tagDuplicationModel
 * @property \Kanboard\Model\TagModel                                $tagModel
 * @property \Kanboard\Model\TaskModel                               $taskModel
 * @property \Kanboard\Model\TaskAnalyticModel                       $taskAnalyticModel
 * @property \Kanboard\Model\TaskCreationModel                       $taskCreationModel
 * @property \Kanboard\Model\TaskDuplicationModel                    $taskDuplicationModel
 * @property \Kanboard\Model\TaskProjectDuplicationModel             $taskProjectDuplicationModel
 * @property \Kanboard\Model\TaskProjectMoveModel                    $taskProjectMoveModel
 * @property \Kanboard\Model\TaskRecurrenceModel                     $taskRecurrenceModel
 * @property \Kanboard\Model\TaskExternalLinkModel                   $taskExternalLinkModel
 * @property \Kanboard\Model\TaskFinderModel                         $taskFinderModel
 * @property \Kanboard\Model\TaskLinkModel                           $taskLinkModel
 * @property \Kanboard\Model\TaskModificationModel                   $taskModificationModel
 * @property \Kanboard\Model\TaskPositionModel                       $taskPositionModel
 * @property \Kanboard\Model\TaskReorderModel                        $taskReorderModel
 * @property \Kanboard\Model\TaskStatusModel                         $taskStatusModel
 * @property \Kanboard\Model\TaskTagModel                            $taskTagModel
 * @property \Kanboard\Model\TaskMetadataModel                       $taskMetadataModel
 * @property \Kanboard\Model\ThemeModel                              $themeModel
 * @property \Kanboard\Model\TimezoneModel                           $timezoneModel
 * @property \Kanboard\Model\TransitionModel                         $transitionModel
 * @property \Kanboard\Model\UserModel                               $userModel
 * @property \Kanboard\Model\UserLockingModel                        $userLockingModel
 * @property \Kanboard\Model\UserNotificationModel                   $userNotificationModel
 * @property \Kanboard\Model\UserNotificationTypeModel               $userNotificationTypeModel
 * @property \Kanboard\Model\UserNotificationFilterModel             $userNotificationFilterModel
 * @property \Kanboard\Model\UserUnreadNotificationModel             $userUnreadNotificationModel
 * @property \Kanboard\Model\UserMetadataModel                       $userMetadataModel
 * @property \Kanboard\Pagination\DashboardPagination                $dashboardPagination
 * @property \Kanboard\Pagination\ProjectPagination                  $projectPagination
 * @property \Kanboard\Pagination\TaskPagination                     $taskPagination
 * @property \Kanboard\Pagination\SubtaskPagination                  $subtaskPagination
 * @property \Kanboard\Pagination\UserPagination                     $userPagination
 * @property \Kanboard\Validator\ActionValidator                     $actionValidator
 * @property \Kanboard\Validator\AuthValidator                       $authValidator
 * @property \Kanboard\Validator\ColumnValidator                     $columnValidator
 * @property \Kanboard\Validator\CategoryValidator                   $categoryValidator
 * @property \Kanboard\Validator\ColumnRestrictionValidator          $columnRestrictionValidator
 * @property \Kanboard\Validator\ColumnMoveRestrictionValidator      $columnMoveRestrictionValidator
 * @property \Kanboard\Validator\CommentValidator                    $commentValidator
 * @property \Kanboard\Validator\ConfigValidator                     $configValidator
 * @property \Kanboard\Validator\CurrencyValidator                   $currencyValidator
 * @property \Kanboard\Validator\CustomFilterValidator               $customFilterValidator
 * @property \Kanboard\Validator\ExternalLinkValidator               $externalLinkValidator
 * @property \Kanboard\Validator\GroupValidator                      $groupValidator
 * @property \Kanboard\Validator\LinkValidator                       $linkValidator
 * @property \Kanboard\Validator\PasswordResetValidator              $passwordResetValidator
 * @property \Kanboard\Validator\ProjectValidator                    $projectValidator
 * @property \Kanboard\Validator\ProjectRoleValidator                $projectRoleValidator
 * @property \Kanboard\Validator\SubtaskValidator                    $subtaskValidator
 * @property \Kanboard\Validator\SwimlaneValidator                   $swimlaneValidator
 * @property \Kanboard\Validator\TagValidator                        $tagValidator
 * @property \Kanboard\Validator\TaskLinkValidator                   $taskLinkValidator
 * @property \Kanboard\Validator\TaskValidator                       $taskValidator
 * @property \Kanboard\Validator\UserValidator                       $userValidator
 * @property \Kanboard\Validator\PredefinedTaskDescriptionValidator  $predefinedTaskDescriptionValidator
 * @property \Kanboard\Import\UserImport                             $userImport
 * @property \Kanboard\Export\SubtaskExport                          $subtaskExport
 * @property \Kanboard\Export\TaskExport                             $taskExport
 * @property \Kanboard\Export\TransitionExport                       $transitionExport
 * @property \Kanboard\Core\Filter\QueryBuilder                      $projectGroupRoleQuery
 * @property \Kanboard\Core\Filter\QueryBuilder                      $projectUserRoleQuery
 * @property \Kanboard\Core\Filter\QueryBuilder                      $projectActivityQuery
 * @property \Kanboard\Core\Filter\QueryBuilder                      $userQuery
 * @property \Kanboard\Core\Filter\QueryBuilder                      $projectQuery
 * @property \Kanboard\Core\Filter\QueryBuilder                      $taskQuery
 * @property \Kanboard\Core\Filter\LexerBuilder                      $taskLexer
 * @property \Kanboard\Core\Filter\LexerBuilder                      $projectActivityLexer
 * @property \Kanboard\Job\CommentEventJob                           $commentEventJob
 * @property \Kanboard\Job\SubtaskEventJob                           $subtaskEventJob
 * @property \Kanboard\Job\TaskEventJob                              $taskEventJob
 * @property \Kanboard\Job\TaskFileEventJob                          $taskFileEventJob
 * @property \Kanboard\Job\TaskLinkEventJob                          $taskLinkEventJob
 * @property \Kanboard\Job\ProjectFileEventJob                       $projectFileEventJob
 * @property \Kanboard\Job\NotificationJob                           $notificationJob
 * @property \Kanboard\Job\ProjectMetricJob                          $projectMetricJob
 * @property \Kanboard\Job\UserMentionJob                            $userMentionJob
 * @property \Psr\Log\LoggerInterface                                $logger
 * @property \PicoDb\Database                                        $db
 * @property \Symfony\Component\EventDispatcher\EventDispatcher      $dispatcher
 * @property \Symfony\Component\Console\Application                  $cli
 * @property \JsonRPC\Server                                         $api
 */
abstract class Base
{
    /**
     * Container instance
     *
     * @access protected
     * @var \Pimple\Container
     */
    protected $container;

    /**
     * Constructor
     *
     * @access public
     * @param  \Pimple\Container   $container
     */
    public function __construct(Container $container)
    {
        $this->container = $container;
    }

    /**
     * Load automatically dependencies
     *
     * @access public
     * @param  string $name Class name
     * @return mixed
     */
    public function __get($name)
    {
        return $this->container[$name];
    }

    /**
     * Get object instance
     *
     * @static
     * @access public
     * @param  Container $container
     * @return static
     */
    public static function getInstance(Container $container)
    {
        return new static($container);
    }
}
