private function extractVisibilityScopeFromObject(&$callerObject): string
    {
        if ($this === $callerObject) {
            //It's me ! Mario ! So Private scope
            return StateInterface::VISIBILITY_PRIVATE;
        }

        if (\get_class($this) === \get_class($callerObject)) {
            //It's a brother (another instance of this same stated class, not a child), So Private scope too
            return StateInterface::VISIBILITY_PRIVATE;
        }

        if ($callerObject instanceof $this) {
            //It's a child class, so Protected.
            return StateInterface::VISIBILITY_PROTECTED;
        }

        //All another case (not same class), public scope
        return StateInterface::VISIBILITY_PUBLIC;
    }