1: <?php
2:
3: /**
4: * This file is part of the Nette Framework (http://nette.org)
5: *
6: * Copyright (c) 2004 David Grudl (http://davidgrudl.com)
7: *
8: * For the full copyright and license information, please view
9: * the file license.txt that was distributed with this source code.
10: * @package Nette\Reflection
11: */
12:
13:
14:
15: /**
16: * Reports information about a method.
17: *
18: * @author David Grudl
19: * @property-read array $defaultParameters
20: * @property-read NClassReflection $declaringClass
21: * @property-read NMethodReflection $prototype
22: * @property-read NExtensionReflection $extension
23: * @property-read NParameterReflection[] $parameters
24: * @property-read IAnnotation[][] $annotations
25: * @property-read string $description
26: * @property-read bool $public
27: * @property-read bool $private
28: * @property-read bool $protected
29: * @property-read bool $abstract
30: * @property-read bool $final
31: * @property-read bool $static
32: * @property-read bool $constructor
33: * @property-read bool $destructor
34: * @property-read int $modifiers
35: * @property-write bool $accessible
36: * @property-read bool $closure
37: * @property-read bool $deprecated
38: * @property-read bool $internal
39: * @property-read bool $userDefined
40: * @property-read string $docComment
41: * @property-read int $endLine
42: * @property-read string $extensionName
43: * @property-read string $fileName
44: * @property-read string $name
45: * @property-read string $namespaceName
46: * @property-read int $numberOfParameters
47: * @property-read int $numberOfRequiredParameters
48: * @property-read string $shortName
49: * @property-read int $startLine
50: * @property-read array $staticVariables
51: * @package Nette\Reflection
52: */
53: class NMethodReflection extends ReflectionMethod
54: {
55:
56: /**
57: * @param string|object
58: * @param string
59: * @return NMethodReflection
60: */
61: public static function from($class, $method)
62: {
63: return new self(is_object($class) ? get_class($class) : $class, $method);
64: }
65:
66:
67: /**
68: * @return NCallback
69: */
70: public function toCallback()
71: {
72: return new NCallback(parent::getDeclaringClass()->getName(), $this->getName());
73: }
74:
75:
76: public function __toString()
77: {
78: return 'Method ' . parent::getDeclaringClass()->getName() . '::' . $this->getName() . '()';
79: }
80:
81:
82: /********************* Reflection layer ****************d*g**/
83:
84:
85: /**
86: * @return NClassReflection
87: */
88: public function getDeclaringClass()
89: {
90: return new NClassReflection(parent::getDeclaringClass()->getName());
91: }
92:
93:
94: /**
95: * @return NMethodReflection
96: */
97: public function getPrototype()
98: {
99: $prototype = parent::getPrototype();
100: return new NMethodReflection($prototype->getDeclaringClass()->getName(), $prototype->getName());
101: }
102:
103:
104: /**
105: * @return NExtensionReflection
106: */
107: public function getExtension()
108: {
109: return ($name = $this->getExtensionName()) ? new NExtensionReflection($name) : NULL;
110: }
111:
112:
113: /**
114: * @return NParameterReflection[]
115: */
116: public function getParameters()
117: {
118: $me = array(parent::getDeclaringClass()->getName(), $this->getName());
119: foreach ($res = parent::getParameters() as $key => $val) {
120: $res[$key] = new NParameterReflection($me, $val->getName());
121: }
122: return $res;
123: }
124:
125:
126: /********************* NAnnotations support ****************d*g**/
127:
128:
129: /**
130: * Has method specified annotation?
131: * @param string
132: * @return bool
133: */
134: public function hasAnnotation($name)
135: {
136: $res = NAnnotationsParser::getAll($this);
137: return !empty($res[$name]);
138: }
139:
140:
141: /**
142: * Returns an annotation value.
143: * @param string
144: * @return IAnnotation
145: */
146: public function getAnnotation($name)
147: {
148: $res = NAnnotationsParser::getAll($this);
149: return isset($res[$name]) ? end($res[$name]) : NULL;
150: }
151:
152:
153: /**
154: * Returns all annotations.
155: * @return IAnnotation[][]
156: */
157: public function getAnnotations()
158: {
159: return NAnnotationsParser::getAll($this);
160: }
161:
162:
163: /**
164: * Returns value of annotation 'description'.
165: * @return string
166: */
167: public function getDescription()
168: {
169: return $this->getAnnotation('description');
170: }
171:
172:
173: /********************* NObject behaviour ****************d*g**/
174:
175:
176: /**
177: * @return NClassReflection
178: */
179: public function getReflection()
180: {
181: return new NClassReflection($this);
182: }
183:
184:
185: public function __call($name, $args)
186: {
187: return NObjectMixin::call($this, $name, $args);
188: }
189:
190:
191: public function &__get($name)
192: {
193: return NObjectMixin::get($this, $name);
194: }
195:
196:
197: public function __set($name, $value)
198: {
199: return NObjectMixin::set($this, $name, $value);
200: }
201:
202:
203: public function __isset($name)
204: {
205: return NObjectMixin::has($this, $name);
206: }
207:
208:
209: public function __unset($name)
210: {
211: NObjectMixin::remove($this, $name);
212: }
213:
214: }
215: