Ranides Atterwim 4 tahun lalu
induk
melakukan
9dc0a12357

+ 3 - 0
assira.core/src/main/java/net/ranides/assira/reflection/IExecutables.java

@@ -7,6 +7,7 @@
 package net.ranides.assira.reflection;
 
 import net.ranides.assira.collection.query.CQuery;
+import net.ranides.assira.functional.special.AnyFunction;
 
 import java.lang.annotation.Annotation;
 import java.lang.invoke.MethodHandle;
@@ -66,4 +67,6 @@ public interface IExecutables<T extends IExecutable> extends IElements<T> {
     CQuery<MethodHandle> handle();
 
     IExecutables<T> accessible();
+
+    AnyFunction<Object> dispatcher();
 }

+ 6 - 0
assira.core/src/main/java/net/ranides/assira/reflection/impl/AConstructors.java

@@ -8,6 +8,7 @@
 package net.ranides.assira.reflection.impl;
 
 import net.ranides.assira.collection.query.CQuery;
+import net.ranides.assira.functional.special.AnyFunction;
 import net.ranides.assira.generic.SerializationUtils;
 import net.ranides.assira.reflection.*;
 
@@ -180,6 +181,11 @@ public class AConstructors<T> extends AElements<IConstructor<T>> implements ICon
         return stream().map(m -> m.handle());
     }
 
+	@Override
+	public AnyFunction<Object> dispatcher() {
+		return new CDispatchFunctions.SimpleCall(this);
+	}
+
 	protected Object writeReplace() {
 		final IHints cHints = this.hints();
 		final List<IConstructor<T>> cList = this.list();

+ 6 - 0
assira.core/src/main/java/net/ranides/assira/reflection/impl/AExecutables.java

@@ -8,6 +8,7 @@
 package net.ranides.assira.reflection.impl;
 
 import net.ranides.assira.collection.query.CQuery;
+import net.ranides.assira.functional.special.AnyFunction;
 import net.ranides.assira.generic.SerializationUtils;
 import net.ranides.assira.reflection.*;
 
@@ -168,6 +169,11 @@ public class AExecutables extends AElements<IExecutable> implements IExecutables
 		return this;
 	}
 
+	@Override
+	public AnyFunction<Object> dispatcher() {
+    	return new CDispatchFunctions.SimpleCall(this);
+	}
+
 	protected Object writeReplace() {
 		final IHints cHints = this.hints();
 		final List<IExecutable> cList = this.list();

+ 6 - 0
assira.core/src/main/java/net/ranides/assira/reflection/impl/AMethods.java

@@ -8,6 +8,7 @@
 package net.ranides.assira.reflection.impl;
 
 import net.ranides.assira.collection.query.CQuery;
+import net.ranides.assira.functional.special.AnyFunction;
 import net.ranides.assira.generic.SerializationUtils;
 import net.ranides.assira.reflection.*;
 
@@ -174,6 +175,11 @@ public class AMethods extends AElements<IMethod> implements IMethods, Serializab
         return stream().map(m -> m.handle());
     }
 
+	@Override
+	public AnyFunction<Object> dispatcher() {
+		return new CDispatchFunctions.SimpleCall(this);
+	}
+
 	protected Object writeReplace() {
 		final IHints cHints = this.hints();
 		final List<IMethod> cList = this.list();

+ 26 - 0
assira.core/src/main/java/net/ranides/assira/reflection/impl/CDispatchFunctions.java

@@ -0,0 +1,26 @@
+package net.ranides.assira.reflection.impl;
+
+import lombok.RequiredArgsConstructor;
+
+import net.ranides.assira.functional.special.AnyFunction;
+import net.ranides.assira.reflection.*;
+
+public class CDispatchFunctions {
+
+    @RequiredArgsConstructor
+    public static final class SimpleCall implements AnyFunction<Object> {
+
+        private final IExecutables<?> exec;
+
+        @Override
+        public Object apply(Object[] arguments) {
+            for (IExecutable e : exec) {
+                if (e.accepts(arguments)) {
+                    return e.apply(arguments);
+                }
+            }
+            throw new IReflectiveException("Can't dispatch method");
+        }
+    }
+
+}