<?php

declare(strict_types=1);

namespace App\Framework\Reflection;

use ReflectionClass;
use ReflectionMethod;
use ReflectionParameter;
use ReflectionProperty;

interface ReflectionProvider
{
    // Wrapped Objekte für erweiterte API
    public function getWrappedClass(string $className): WrappedReflectionClass;

    public function getWrappedMethod(string $className, string $methodName): WrappedReflectionMethod;

    // Original Reflection Objekte
    public function getClass(string $className): ReflectionClass;

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

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

    public function getProperties(string $className): array;

    public function getAttributes(string $className, ?string $attributeClass = null): array;

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

    public function hasAttribute(string $className, string $attributeClass): bool;

    public function getParameterInfo(string $className, string $methodName): array;

    public function isInstantiable(string $className): bool;

    public function implementsInterface(string $className, string $interfaceName): bool;

    public function forget(string $className): void;

    public function flush(): void;
}
