vendor/mondator/src/Mandango/Mondator/ClassExtension.php
author ymh <ymh.work@gmail.com>
Sun, 06 Nov 2011 23:44:37 +0100
changeset 27 1df556b2c0f9
parent 18 c85b9d1ddf19
permissions -rw-r--r--
Correct memory problem
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of Mandango.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Pablo Díez <pablodip@gmail.com>
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * This source file is subject to the MIT license that is bundled
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * with this source code in the file LICENSE.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Mandango\Mondator;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Mandango\Mondator\Definition\Method;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
use Mandango\Mondator\Definition\Property;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
/**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 * ClassExtension is the base class for class extensions.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 * @author Pablo Díez <pablodip@gmail.com>
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
 *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
 * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
 */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
abstract class ClassExtension
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
{
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    private $options;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    private $requiredOptions;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    protected $definitions;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    protected $class;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    protected $configClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    protected $configClass;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    protected $newClassExtensions;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    protected $newConfigClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    protected $twig;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    protected $twigTempDir;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     * Constructor.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
     * @param array $options An array of options.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    public function __construct(array $options = array())
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        $this->options = array();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        $this->requiredOptions = array();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        $this->setUp();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        foreach ($options as $name => $value) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
            $this->setOption($name, $value);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        // required options
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        if ($diff = array_diff($this->requiredOptions, array_keys($options))) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            throw new \RuntimeException(sprintf('%s requires the options: "%s".', get_class($this), implode(', ', $diff)));
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     * Set up the extension.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
    protected function setUp()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
     * Add an option.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
     * @param string $name         The option name.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
     * @param mixed  $defaultValue The default value (optional, null by default).
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    protected function addOption($name, $defaultValue = null)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        $this->options[$name] = $defaultValue;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
     * Add options.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
     * @param array $options An array with options (name as key and default value as value).
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    protected function addOptions(array $options)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        foreach ($options as $name => $defaultValue) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
            $this->addOption($name, $defaultValue);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
     * Add a required option.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
     * @param string $name The option name.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    protected function addRequiredOption($name)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        $this->addOption($name);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        $this->requiredOptions[] = $name;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
     * Add required options.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
     * @param array $options An array with the name of the required option as value.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
    protected function addRequiredOptions(array $options)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        foreach ($options as $name) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
            $this->addRequiredOption($name);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
     * Returns if exists an option.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
     * @param string $name The name.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
     * @return bool Returns true if the option exists, false otherwise.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    public function hasOption($name)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        return array_key_exists($name, $this->options);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
     * Set an option.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
     * @param string $name  The name.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
     * @param mixed  $value The value.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
     * @throws \InvalidArgumentException If the option does not exists.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
    public function setOption($name, $value)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
        if (!$this->hasOption($name)) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
            throw new \InvalidArgumentException(sprintf('The option "%s" does not exists.', $name));
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
        $this->options[$name] = $value;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
     * Returns the options.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
     * @return array The options.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
    public function getOptions()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        return $this->options;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
     * Return an option.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
     * @param string $name The name.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
     * @return mixed The value of the option.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
     * @throws \InvalidArgumentException If the options does not exists.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
    public function getOption($name)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
        if (!$this->hasOption($name)) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
            throw new \InvalidArgumentException(sprintf('The option "%s" does not exists.', $name));
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
        return $this->options[$name];
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
     * New class extensions process.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
     * @param string       $class              The class.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
     * @param \ArrayObject $configClasses      The config classes.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
     * @param \ArrayObject $newClassExtensions The new class extensions.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
    public function newClassExtensionsProcess($class, \ArrayObject $configClasses, \ArrayObject $newClassExtensions)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
        $this->class = $class;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
        $this->configClasses = $configClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
        $this->configClass = $configClasses[$class];
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
        $this->newClassExtensions = $newClassExtensions;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
        $this->doNewClassExtensionsProcess();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
        $this->class = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
        $this->configClasses = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
        $this->configClass = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
        $this->newClassExtensions = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
     * Do the new class extensions process.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
     * Here you can add new class extensions.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
    protected function doNewClassExtensionsProcess()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
     * New config classes process.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
     * @param string       $class            The class.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
     * @param \ArrayObject $configClasses    The config classes.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
     * @param \ArrayObject $newConfigClasses The new config classes.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
    public function newConfigClassesProcess($class, \ArrayObject $configClasses, \ArrayObject $newConfigClasses)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
        $this->class = $class;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
        $this->configClasses = $configClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        $this->configClass = $configClasses[$class];
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        $this->newConfigClasses = $newConfigClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
        $this->doNewConfigClassesProcess();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
        $this->class = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        $this->configClasses = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
        $this->configClass = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
        $this->newConfigClasses = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
     * Do the new config classes process.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
     * Here you can add new config classes, and change the config classes
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
     * if it is necessary to build the new config classes.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
    protected function doNewConfigClassesProcess()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
     * Process the config class.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
     * @param string       $class         The class.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
     * @param \ArrayObject $configClasses The config classes.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
    public function configClassProcess($class, \ArrayObject $configClasses)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
        $this->class = $class;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
        $this->configClasses = $configClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
        $this->configClass = $configClasses[$class];
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
        $this->doConfigClassProcess();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
        $this->class = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
        $this->configClasses = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
        $this->configClass = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
     * Do the config class process.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
     * Here you can modify the config class.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
    protected function doConfigClassProcess()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
     * Process the class.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
     * @param string                      $class         The class.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
     * @param \ArrayObject                $configClasses The config classes.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
     * @param Mandango\Mondator\Container $container     The container.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    public function classProcess($class, \ArrayObject $configClasses, Container $container)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        $this->class = $class;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
        $this->configClasses = $configClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
        $this->configClass = $configClasses[$class];
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        $this->definitions = $container;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
        $this->doClassProcess();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
        $this->class = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
        $this->configClasses = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
        $this->configClass = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
        $this->definitions = null;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
     * Do the class process.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
     *
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
     * @api
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
    protected function doClassProcess()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
    /**
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
     * Twig.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
    protected function processTemplate(Definition $definition, $name, array $variables = array())
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
        $twig = $this->getTwig();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
        $variables['options'] = $this->options;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
        $variables['class'] = $this->class;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
        $variables['config_class'] = $this->configClass;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
        $variables['config_classes'] = $this->configClasses;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        $result = $twig->loadTemplate($name)->render($variables);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
        // properties
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
        $expression = '/
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
            (?P<docComment>\ \ \ \ \/\*\*\n[\s\S]*\ \ \ \ \ \*\/)?\n?
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
             \ \ \ \ (?P<static>static\ )?
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
            (?P<visibility>public|protected|private)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
            \s
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
            \$
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
            (?P<name>[a-zA-Z0-9_]+)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
            ;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
        /xU';
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
        preg_match_all($expression, $result, $matches);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
        for ($i = 0; $i <= count($matches[0]) - 1; $i++) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
            $property = new Property($matches['visibility'][$i], $matches['name'][$i], null);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
            if ($matches['static'][$i]) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
                $property->setStatic(true);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
            }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
            if ($matches['docComment'][$i]) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
                $property->setDocComment($matches['docComment'][$i]);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
            }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
            $definition->addProperty($property);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
        // methods
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
        $expression = '/
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
            (?P<docComment>\ \ \ \ \/\*\*\n[\s\S]*\ \ \ \ \ \*\/)?\n
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
            \ \ \ \ (?P<static>static\ )?
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
            (?P<visibility>public|protected|private)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
            \s
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
            function
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
            \s
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
            (?P<name>[a-zA-Z0-9_]+)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
            \((?P<arguments>[$a-zA-Z0-9_\\\=\(\), ]*)\)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
            \n
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
            \ \ \ \ \{
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
                (?P<code>[\s\S]*)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
            \n\ \ \ \ \}
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
        /xU';
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
        preg_match_all($expression, $result, $matches);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
        for ($i = 0; $i <= count($matches[0]) - 1; $i++) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
            $code = trim($matches['code'][$i], "\n");
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
            $method = new Method($matches['visibility'][$i], $matches['name'][$i], $matches['arguments'][$i], $code);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
            if ($matches['static'][$i]) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
                $method->setStatic(true);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
            }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
            if ($matches['docComment'][$i]) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
                $method->setDocComment($matches['docComment'][$i]);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
            }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
            $definition->addMethod($method);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
    public function getTwig()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
        if (null === $this->twig) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
            if (!class_exists('Twig_Environment')) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
                throw new \RuntimeException('Twig is required to use templates.');
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
            }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
            $loader = new \Twig_Loader_String();
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
            $twig = new \Twig_Environment($loader, array(
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
                'autoescape'       => false,
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
                'strict_variables' => true,
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
                'debug'            => true,
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
                'cache'            => $this->twigTempDir = sys_get_temp_dir().'Mondator/'.mt_rand(111111, 999999),
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
            ));
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
            $this->configureTwig($twig);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
            $this->twig = $twig;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
        return $this->twig;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
    protected function configureTwig(\Twig_Environment $twig)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
    /*
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
     * Tools.
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
     */
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
    protected function createClassExtensionFromArray(array $data)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
        if (!isset($data['class'])) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
            throw new \InvalidArgumentException(sprintf('The extension does not have class.'));
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
        return new $data['class'](isset($data['options']) ? $data['options'] : array());
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
    private function removeDir($target)
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
        $fp = opendir($target);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
        while (false !== $file = readdir($fp)) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
            if (in_array($file, array('.', '..'))) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
                continue;
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
            }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
            if (is_dir($target.'/'.$file)) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
                self::removeDir($target.'/'.$file);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
            } else {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
                unlink($target.'/'.$file);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
            }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
        closedir($fp);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
        rmdir($target);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
    public function __destruct()
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
    {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
        if ($this->twigTempDir && is_dir($this->twigTempDir)) {
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
            $this->removeDir($this->twigTempDir);
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
        }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
    }
c85b9d1ddf19 first implementation of dynamic fields
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
}