Blame view

vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php 3.32 KB
ad2e91f7   Mihail   move multyparser ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  <?php
  
  /*
   * This file is part of the Prophecy.
   * (c) Konstantin Kudryashov <ever.zet@gmail.com>
   *     Marcello Duarte <marcello.duarte@gmail.com>
   *
   * For the full copyright and license information, please view the LICENSE
   * file that was distributed with this source code.
   */
  
  namespace Prophecy\Doubler;
  
  use Prophecy\Exception\Doubler\DoubleException;
  use Prophecy\Exception\Doubler\ClassNotFoundException;
  use Prophecy\Exception\Doubler\InterfaceNotFoundException;
  use ReflectionClass;
  
  /**
   * Lazy double.
   * Gives simple interface to describe double before creating it.
   *
   * @author Konstantin Kudryashov <ever.zet@gmail.com>
   */
  class LazyDouble
  {
      private $doubler;
      private $class;
      private $interfaces = array();
      private $arguments  = null;
      private $double;
  
      /**
       * Initializes lazy double.
       *
       * @param Doubler $doubler
       */
      public function __construct(Doubler $doubler)
      {
          $this->doubler = $doubler;
      }
  
      /**
       * Tells doubler to use specific class as parent one for double.
       *
       * @param string|ReflectionClass $class
       *
       * @throws \Prophecy\Exception\Doubler\ClassNotFoundException
       * @throws \Prophecy\Exception\Doubler\DoubleException
       */
      public function setParentClass($class)
      {
          if (null !== $this->double) {
              throw new DoubleException('Can not extend class with already instantiated double.');
          }
  
          if (!$class instanceof ReflectionClass) {
              if (!class_exists($class)) {
                  throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class);
              }
  
              $class = new ReflectionClass($class);
          }
  
          $this->class = $class;
      }
  
      /**
       * Tells doubler to implement specific interface with double.
       *
       * @param string|ReflectionClass $interface
       *
       * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException
       * @throws \Prophecy\Exception\Doubler\DoubleException
       */
      public function addInterface($interface)
      {
          if (null !== $this->double) {
              throw new DoubleException(
                  'Can not implement interface with already instantiated double.'
              );
          }
  
          if (!$interface instanceof ReflectionClass) {
              if (!interface_exists($interface)) {
                  throw new InterfaceNotFoundException(
                      sprintf('Interface %s not found.', $interface),
                      $interface
                  );
              }
  
              $interface = new ReflectionClass($interface);
          }
  
          $this->interfaces[] = $interface;
      }
  
      /**
       * Sets constructor arguments.
       *
       * @param array $arguments
       */
      public function setArguments(array $arguments = null)
      {
          $this->arguments = $arguments;
      }
  
      /**
       * Creates double instance or returns already created one.
       *
       * @return DoubleInterface
       */
      public function getInstance()
      {
          if (null === $this->double) {
              if (null !== $this->arguments) {
                  return $this->double = $this->doubler->double(
                      $this->class, $this->interfaces, $this->arguments
                  );
              }
  
              $this->double = $this->doubler->double($this->class, $this->interfaces);
          }
  
          return $this->double;
      }
  }