<?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.