private function addMethods(Event $abs)
    {
        $obj = $abs->getSubject();
        if (!$abs['collectMethods']) {
            $this->addMethodsMin($abs);
            return;
        }
        if ($this->abstracter->getCfg('cacheMethods') && isset(static::$methodCache[$abs['className']])) {
            $abs['methods'] = static::$methodCache[$abs['className']];
        } else {
            $methodArray = array();
            $methods = $abs['reflector']->getMethods();
            $interfaceMethods = array(
                'ArrayAccess' => array('offsetExists','offsetGet','offsetSet','offsetUnset'),
                'Countable' => array('count'),
                'Iterator' => array('current','key','next','rewind','void'),
                'IteratorAggregate' => array('getIterator'),
                // 'Throwable' => array('getMessage','getCode','getFile','getLine','getTrace','getTraceAsString','getPrevious','__toString'),
            );
            $interfacesHide = \array_intersect($abs['implements'], \array_keys($interfaceMethods));
            foreach ($methods as $reflectionMethod) {
                $info = $this->methodInfo($obj, $reflectionMethod);
                $methodName = $reflectionMethod->getName();
                if ($info['visibility'] === 'private' && $info['inheritedFrom']) {
                    /*
                        getMethods() returns parent's private methods (must be a reason... but we'll skip it)
                    */
                    continue;
                }
                foreach ($interfacesHide as $interface) {
                    if (\in_array($methodName, $interfaceMethods[$interface])) {
                        // this method implements this interface
                        $info['implements'] = $interface;
                        break;
                    }
                }
                $methodArray[$methodName] = $info;
            }
            $abs['methods'] = $methodArray;
            $this->addMethodsPhpDoc($abs);
            static::$methodCache[$abs['className']] = $abs['methods'];
        }
        if (isset($abs['methods']['__toString'])) {
            $abs['methods']['__toString']['returnValue'] = $obj->__toString();
        }
        return;
    }