public static function byObjectMethod($values, $method)
    {
        if (isset($values) && Inspector::isTraversable($values)) {
            if (is_array($values)) {
                $flat_values = array();
                $setter = 'setArrayValue';
            } else {
                $flat_values = new \stdClass();
                $setter = 'setObjectValue';
            }

            foreach ($values as $key => $value) {
                if (is_object($value) && method_exists($value, $method)) {
                    $flat_value = $value->{$method}();
                    static::$setter($flat_values, $key, $flat_value);
                } else {
                    static::$setter($flat_values, $key, $value);
                }
            }

            return $flat_values;
        }

        return $values;
    }