using System;
using System.Collections.Generic;
using System.Reflection;

namespace ZeroLevel.Services.Invokation
{
    public interface IInvokeWrapper
    {
        IEnumerable<string> Configure<T>();

        IEnumerable<string> Configure<T>(string methodName);

        IEnumerable<string> Configure<T>(Func<MethodInfo, bool> filter);

        IEnumerable<string> Configure(Type instanceType);

        IEnumerable<string> Configure(Type instanceType, string methodName);

        IEnumerable<string> Configure(Type instanceType, Func<MethodInfo, bool> filter);

        IEnumerable<string> ConfigureGeneric<T>(Type instanceType, string methodName);

        IEnumerable<string> ConfigureGeneric<T>(Type instanceType, Func<MethodInfo, bool> filter);

        IEnumerable<string> ConfigureGeneric(Type instanceType, Type genericType, string methodName);

        IEnumerable<string> ConfigureGeneric(Type instanceType, Type genericType, Func<MethodInfo, bool> filter);

        string Configure(MethodInfo method);

        string Configure(Delegate handler);

        IEnumerable<string> Configure(IEnumerable<MethodInfo> list);

        object InvokeStatic(string identity, object[] args);

        object Invoke(object target, string identity, object[] args);

        object Invoke(object target, string identity);

        object Invoke(string methodName, object[] args);

        string GetInvokerIdentity(string methodName, params Type[] argsTypes);

        Invoker GetInvoker(string identity);

        Invoker GetInvoker(string methodName, params Type[] argsTypes);
    }
}