<?php

declare(strict_types=1);

namespace App\Framework\Reflection\Contracts;

use App\Framework\Core\ValueObjects\ClassName;
use App\Framework\Reflection\Collections\AttributeCollection;
use App\Framework\Reflection\Collections\ParameterCollection;
use App\Framework\Reflection\WrappedReflectionMethod;
use ReflectionMethod;

/**
 * Interface for method-level reflection operations
 */
interface MethodReflector
{
    public function getMethod(ClassName $className, string $methodName): WrappedReflectionMethod;

    public function getNativeMethod(ClassName $className, string $methodName): ReflectionMethod;

    public function getMethodParameters(ClassName $className, string $methodName): ParameterCollection;

    public function getMethodAttributes(ClassName $className, string $methodName, ?string $attributeClass = null): AttributeCollection;

    /**
     * @return array<array<string, mixed>>
     */
    public function getParameterInfo(ClassName $className, string $methodName): array;
}
