From f92b1b61098f5cfdd4eb786f1fbacdedf5c38824 Mon Sep 17 00:00:00 2001 From: Chuck Hagenbuch Date: Sat, 13 Mar 2010 21:03:46 -0500 Subject: [PATCH] first pass at automatic setter injection --- framework/Injector/lib/Horde/Injector.php | 1 - .../lib/Horde/Injector/Binder/Implementation.php | 28 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/framework/Injector/lib/Horde/Injector.php b/framework/Injector/lib/Horde/Injector.php index c37bd273d..eefb3ef84 100644 --- a/framework/Injector/lib/Horde/Injector.php +++ b/framework/Injector/lib/Horde/Injector.php @@ -234,5 +234,4 @@ class Horde_Injector implements Horde_Injector_Scope return $this->_instances[$interface]; } - } diff --git a/framework/Injector/lib/Horde/Injector/Binder/Implementation.php b/framework/Injector/lib/Horde/Injector/Binder/Implementation.php index 66928a321..2ccb4a3a9 100644 --- a/framework/Injector/lib/Horde/Injector/Binder/Implementation.php +++ b/framework/Injector/lib/Horde/Injector/Binder/Implementation.php @@ -16,8 +16,9 @@ class Horde_Injector_Binder_Implementation implements Horde_Injector_Binder /** * TODO + * @var array */ - private $_setters; + private $_setters = array(); /** * TODO @@ -62,6 +63,10 @@ class Horde_Injector_Binder_Implementation implements Horde_Injector_Binder $reflectionClass = new ReflectionClass($this->_implementation); $this->_validateImplementation($reflectionClass); $instance = $this->_getInstance($injector, $reflectionClass); + $setters = $this->_findSetters($reflectionClass); + foreach ($setters as $setter) { + $this->bindSetter($setter); + } $this->_callSetters($injector, $instance); return $instance; } @@ -131,4 +136,25 @@ class Horde_Injector_Binder_Implementation implements Horde_Injector_Binder } } + /** + * Find annotated setters in the class docblock + * + * @param ReflectionClass $reflectionClass + * + * @return array + */ + private function _findSetters(ReflectionClass $reflectionClass) + { + $setters = array(); + $docBlock = $reflectionClass->getDocComment(); + if ($docBlock) { + if (preg_match_all('/@inject (\w+)/', $docBlock, $matches)) { + foreach ($matches[1] as $setter) { + $setters[] = $setter; + } + } + } + + return $setters; + } } -- 2.11.0