koriym/Ray.Aop — pull request #27 by iteman (2014-08-08 02:48:31+00:00)
Title: fix a problem that causes a binding not to work with logicalXXX() as a method matcher

| Q | A
| ------------- | ---
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | -
| License | BSD-3-Clause
| Doc PR | -

Ray.Di の `AbstractModule::bindInterceptor()` のメソッドマッチャーで `logicalAnd()` を使うと、以下のような例外が発生します。

```php
$this->bindInterceptor(
$this->matcher->any(),
$this->matcher->logicalAnd(
$this->matcher->annotatedWith('...'),
$this->matcher->annotatedWith('...')
),
[...]
);
```

```console
Fatal error: Uncaught exception 'ReflectionException' with message 'Class disableOutput does not exist' in /path/to/project/vendor/ray/aop/src/Matcher.php on line 236

ReflectionException: Class disableOutput does not exist in /path/to/project/vendor/ray/aop/src/Matcher.php on line 236

Call Stack:
0.0002 249824 1. {main}() /path/to/project/bootstrap/contexts/api.php:0
0.0071 1052816 2. require('/path/to/project/bootstrap/instance.php') /path/to/project/bootstrap/contexts/api.php:34
0.0071 1053056 3. BEAR\Package\Bootstrap\Bootstrap::getApp() /path/to/project/bootstrap/instance.php:19
...
0.1938 6353672 32. Ray\Di\AbstractModule->__invoke() /path/to/project/vendor/ray/di/src/Injector.php:211
0.1938 6354304 33. Ray\Aop\Bind->bind() /path/to/project/vendor/ray/di/src/AbstractModule.php:436
0.1968 6353048 34. Ray\Aop\Bind->bindPointcut() /path/to/project/vendor/ray/aop/src/Bind.php:40
0.1968 6353224 35. Ray\Aop\Bind->bindByCallable() /path/to/project/vendor/ray/aop/src/Bind.php:63
0.1968 6354400 36. Ray\Aop\AbstractMatcher->__invoke() /path/to/project/vendor/ray/aop/src/Bind.php:120
0.1968 6355488 37. call_user_func_array() /path/to/project/vendor/ray/aop/src/AbstractMatcher.php:70
0.1968 6356144 38. Ray\Aop\Matcher->isLogicalAnd() /path/to/project/vendor/ray/aop/src/AbstractMatcher.php:70
0.1968 6356144 39. Ray\Aop\AbstractMatcher->__invoke() /path/to/project/vendor/ray/aop/src/Matcher.php:338
0.1968 6357448 40. call_user_func_array() /path/to/project/vendor/ray/aop/src/AbstractMatcher.php:70
0.1968 6357968 41. Ray\Aop\Matcher->isAnnotatedWith() /path/to/project/vendor/ray/aop/src/AbstractMatcher.php:70
0.1968 6357968 42. Ray\Aop\Matcher->setAnnotations() /path/to/project/vendor/ray/aop/src/Matcher.php:221
0.1968 6358184 43. ReflectionClass->__construct() /path/to/project/vendor/ray/aop/src/Matcher.php:236
```

調べてみると、`Ray\Aop\Bind::bind()` の第 2 引数で `logicalOr`、`logicalAnd`、`logicalXor`、`logicalNot` のいずれかを使うと、`Ray\Aop\Bind::bindByCallable()` のメソッドマッチャーの呼び出しの第 1 引数にメソッド名が渡され `$methodMatcher($method->name, Matcher::TARGET_METHOD)`、メソッド名をクラス名として `ReflectionClass` オブジェクトを作成するところ `Matcher::setAnnotations()` で上記の例外が発生することがわかりました。

このプルリクエストは上記問題を修正し、`bind()` の第 2 引数で `logicalOr`、`logicalAnd`、`logicalXor`、`logicalNot` を使えるようにします。