<?php

namespace Illuminate\View;

use Closure;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use InvalidArgumentException;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\View\Engines\EngineResolver;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\View\Factory as FactoryContract;
// super cool namespace
class Factory implements FactoryContract
{// factory implements the Factory Contract
    /**
     * The engine implementation.
     *
     * @var \Illuminate\View\Engines\EngineResolver
     */
    protected $engines;// The engine implementation

    /**
     * The view finder implementation.
     *
     * @var \Illuminate\View\ViewFinderInterface
     */
    protected $finder;//The view finder implementation,this protected

    /**
     * The event dispatcher instance.
     *
     * @var \Illuminate\Contracts\Events\Dispatcher
     */
    protected $events;// the event dispatcher instance

    /**
     * The IoC container instance.
     *
     * @var \Illuminate\Contracts\Container\Container
     */
    protected $container;//The IoC container instance

    /**
     * Data that should be available to all templates.
     *
     * @var array
     */
    protected $shared = [];//Data that should be available to all templates.
   // this mind may be too expensive

    /**
     * Array of registered view name aliases.
     *
     * @var array
     */
    protected $aliases = [];// array of registered view name aliases.

    /**
     * All of the registered view names.
     *
     * @var array
     */
    protected $names = [];//all of the registered view names.

    /**
     * The extension to engine bindings.
     *
     * @var array
     */
    protected $extensions = ['blade.php' => 'blade', 'php' => 'php'];
   // The extension to engine bindings.

    /**
     * The view composer events.
     *
     * @var array
     */
    protected $composers = [];//The view composer events

    /**
     * All of the finished, captured sections.
     *
     * @var array
     */
    protected $sections = [];//All of the finished, captured sections

    /**
     * The stack of in-progress sections.
     *
     * @var array
     */
    protected $sectionStack = [];//The stack of in-progress sections.

    /**
     * The number of active rendering operations.
     *
     * @var int
     */
    protected $renderCount = 0;// The number of active rendering operations.

    /**
     * Create a new view factory instance.
     *
     * @param  \Illuminate\View\Engines\EngineResolver  $engines
     * @param  \Illuminate\View\ViewFinderInterface  $finder
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    public function __construct(EngineResolver $engines, ViewFinderInterface $finder, Dispatcher $events)
    {// create a new view factory instance.
        $this->finder = $finder;
        $this->events = $events;
        $this->engines = $engines;// get this engines

        $this->share('__env', $this);
    }//share env

    /**
     * Get the evaluated view contents for the given view.
     *
     * @param  string  $path
     * @param  array   $data
     * @param  array   $mergeData
     * @return \Illuminate\Contracts\View\View
     */
    public function file($path, $data = [], $mergeData = [])
    {// get the data
        $data = array_merge($mergeData, $this->parseData($data));
// array_merge
        $this->callCreator($view = new View($this, $this->getEngineFromPath($path), $path, $path, $data));
// callCreator
        return $view;
    }// Get the evaluated view contents for the given view.