Add __get() and __set() wrappers for KeyDescender. This allows $kd->{"some.descendable.key"} access.

Robert Sesek [2009-08-04 19:46]
Add __get() and __set() wrappers for KeyDescender. This allows $kd->{"some.descendable.key"} access.
diff --git a/base/key_descender.php b/base/key_descender.php
index 6875df1..5f722e8 100644
--- a/base/key_descender.php
+++ b/base/key_descender.php
@@ -136,6 +136,11 @@ class KeyDescender
 		}
 	}

+	// Wrappers for get() and set() so we can do magical property access, which
+	// will even apply to arrays.
+	public function __get($key) { return $this->get($key); }
+	public function __set($key, $value) { $this->set($key, $value); }
+
 	// Getters and setters.
 	// -------------------------------------------------------------------------
 	public function & root() { return $this->root; }
diff --git a/testing/tests/base/key_descender_test.php b/testing/tests/base/key_descender_test.php
index fe0cd08..c725141 100644
--- a/testing/tests/base/key_descender_test.php
+++ b/testing/tests/base/key_descender_test.php
@@ -163,4 +163,20 @@ class KeyDescenderTest extends \PHPUnit_Framework_TestCase
 		$desc->set('foo.test', 'abc');
 		$this->assertEquals('abc', $desc->get('foo.test'));
 	}
+
+	public function testMagicGetter()
+	{
+		$array = array('foo' => array('moo' => 'boo'));
+		$desc = new KeyDescender($array);
+		$this->assertEquals('boo', $desc->{"foo.moo"});
+		$this->assertSame($array['foo'], $desc->foo);
+	}
+
+	public function testMagicSetter()
+	{
+		$array = array('foo' => array('moo' => 'boo'));
+		$desc = new KeyDescender($array);
+		$desc->{"foo.moo"} = 'abc123';
+		$this->assertEquals('abc123', $desc->get('foo.moo'));
+	}
 }