--- /dev/null
+<?php
+namespace Consolidation\Config\Util;
+
+/**
+ * Fetch a configuration value from a configuration group. If the
+ * desired configuration value is not found in the most specific
+ * group named, keep stepping up to the next parent group until a
+ * value is located.
+ *
+ * Given the following constructor inputs:
+ * - $prefix = "command."
+ * - $group = "foo.bar.baz"
+ * - $postfix = ".options."
+ * Then the `get` method will then consider, in order:
+ * - command.foo.bar.baz.options
+ * - command.foo.bar.options
+ * - command.foo.options
+ * If any of these contain an option for "$key", then return its value.
+ */
+abstract class ConfigGroup
+{
+ protected $config;
+ protected $group;
+ protected $prefix;
+ protected $postfix;
+
+ public function __construct($config, $group, $prefix = '', $postfix = '.')
+ {
+ $this->config = $config;
+ $this->group = $group;
+ $this->prefix = $prefix;
+ $this->postfix = $postfix;
+ }
+
+ /**
+ * Return a description of the configuration group (with prefix and postfix).
+ */
+ public function describe($property)
+ {
+ return $this->prefix . $this->group . $this->postfix . $property;
+ }
+
+ /**
+ * Get the requested configuration key from the most specific configuration
+ * group that contains it.
+ */
+ abstract public function get($key);
+
+ /**
+ * Given a group name, such as "foo.bar.baz", return the next configuration
+ * group in the fallback hierarchy, e.g. "foo.bar".
+ */
+ protected function moreGeneralGroupName($group)
+ {
+ $result = preg_replace('#\.[^.]*$#', '', $group);
+ if ($result != $group) {
+ return $result;
+ }
+ return false;
+ }
+}