using System;
using System.Reflection;
using System.Linq;

namespace Aurora.Backend.Executors
{
    public abstract class BaseExecutor
    {
        public BaseExecutor()
        {
        }

        public ExecutorType ExecutorType { get; protected set; }

        public static BaseExecutor CreateExecutor<T>(ExecutorType executorType) where T : BaseExecutor
        {
            MethodInfo method = typeof(T).GetMethod("Create");
            if (method == null)
            {
                throw new InvalidOperationException("Executor must include a 'create' method.");
            }

            return method.Invoke(null, new object[] { executorType }) as BaseExecutor;
        }
    }

    public enum ExecutorType
    {
        Server,
        Client
    }
}