1<?php 2 3/* 4 * This file is part of the Prophecy. 5 * (c) Konstantin Kudryashov <ever.zet@gmail.com> 6 * Marcello Duarte <marcello.duarte@gmail.com> 7 * 8 * For the full copyright and license information, please view the LICENSE 9 * file that was distributed with this source code. 10 */ 11 12namespace Prophecy\Doubler\ClassPatch; 13 14use Prophecy\Doubler\Generator\Node\ClassNode; 15use Prophecy\Doubler\Generator\Node\MethodNode; 16 17/** 18 * Disable constructor. 19 * Makes all constructor arguments optional. 20 * 21 * @author Konstantin Kudryashov <ever.zet@gmail.com> 22 */ 23class DisableConstructorPatch implements ClassPatchInterface 24{ 25 /** 26 * Checks if class has `__construct` method. 27 * 28 * @param ClassNode $node 29 * 30 * @return bool 31 */ 32 public function supports(ClassNode $node) 33 { 34 return true; 35 } 36 37 /** 38 * Makes all class constructor arguments optional. 39 * 40 * @param ClassNode $node 41 */ 42 public function apply(ClassNode $node) 43 { 44 if (!$node->hasMethod('__construct')) { 45 $node->addMethod(new MethodNode('__construct', '')); 46 47 return; 48 } 49 50 $constructor = $node->getMethod('__construct'); 51 foreach ($constructor->getArguments() as $argument) { 52 $argument->setDefault(null); 53 } 54 55 $constructor->setCode(<<<PHP 56if (0 < func_num_args()) { 57 call_user_func_array(array('parent', '__construct'), func_get_args()); 58} 59PHP 60 ); 61 } 62 63 /** 64 * Returns patch priority, which determines when patch will be applied. 65 * 66 * @return int Priority number (higher - earlier) 67 */ 68 public function getPriority() 69 { 70 return 100; 71 } 72} 73