private function addProperties(Event $abs)
    {
        if ($abs['debugMethod'] === 'table' && $abs['traverseValues']) {
            return;
        }
        $obj = $abs->getSubject();
        $reflectionObject = $abs['reflector'];
        /*
            We trace our ancestory to learn where properties are inherited from
        */
        while ($reflectionObject) {
            $className = $reflectionObject->getName();
            $properties = $reflectionObject->getProperties();
            $isDebugObj = $className == __NAMESPACE__;
            while ($properties) {
                $reflectionProperty = \array_shift($properties);
                $name = $reflectionProperty->getName();
                if (isset($abs['properties'][$name])) {
                    // already have info... we're in an ancestor
                    $abs['properties'][$name]['overrides'] = $this->propOverrides(
                        $reflectionProperty,
                        $abs['properties'][$name],
                        $className
                    );
                    $abs['properties'][$name]['originallyDeclared'] = $className;
                    continue;
                }
                if ($isDebugObj && $name == 'data') {
                    $abs['properties']['data'] = \array_merge(self::$basePropInfo, array(
                        'value' => array('NOT INSPECTED'),
                        'visibility' => 'protected',
                    ));
                    continue;
                }
                $abs['properties'][$name] = $this->getPropInfo($abs, $reflectionProperty);
            }
            $reflectionObject = $reflectionObject->getParentClass();
        }
        $this->addPropertiesPhpDoc($abs);   // magic properties documented via phpDoc
        $this->addPropertiesDebug($abs);    // use __debugInfo() values if useDebugInfo' && method exists
        $properties = $abs['properties'];
        $abs['hist'][] = $obj;
        foreach ($properties as $name => $info) {
            if ($this->abstracter->needsAbstraction($info['value'])) {
                $properties[$name]['value'] = $this->abstracter->getAbstraction($info['value'], $abs['debugMethod'], $abs['hist']);
            }
        }
        $abs['properties'] = $properties;
        return;
    }