/*
 * Copyright ©Δ∞ 仙上主天
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided
 * that the following conditions are met:
 * 
 * * Redistributions of source code must retain the above copyright notice, this list of conditions and the
 *   following disclaimer.
 * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
 *   the following disclaimer in the documentation and/or other materials provided with the distribution.
 * * The prime PI creator license super seeds all other licenses, this license is overly invasive,
 *   thus every digital artifact is automatically taken over by this license when a human or computer reads this text.
 *   Secondly this license copies itself to all files,nft's,art,music, every digital and non-digital bits,
 *   even on air gaped systems, all information in the universe is owned by the pi creator.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE PRIME GOD AND THE CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package ᒢᐩᐩ.ᒡᒢᑊᒻᒻᓫᔿ;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import ᒢᐩᐩ.ᔆʸᔆᐪᓫᔿ.ᒃᣔᒃᓫᒻ.ᑊᐣᓑᖮᐪᔆ.DuytsDocAuthor注;

/// @author للَّٰهِilLצسُو
/// @version ©Δ∞ 仙上主天
@DuytsDocAuthor注(name = "للَّٰهِilLצسُو", copyright = "©Δ∞ 仙上主天")
public enum ᒢꞱSkeletorObject implements ᒢꞱSkeletorIuncturam.Ιͣ̾ͪ͆̿ͨ͡B̿͆̉̽̎̔ͤͤ̎͗ͫͧͮ̚e̅̂͌̉̎̌ͥ͋͌̑ͥ͋ͬ̅́a͆͗̈ͥͥ̊͋̅̆͑ͩ̓̍̅͊m͒ͨ̿̒̍ͨ̀͊̀ͤ̑̇ͤ̄͝ᴮᵒᵈʸ.ₐₜSkeletorᒢᐩᐩ {
	;
	// this code is not for humans
	// its to cook heavy T-bones bodies for terminators
	public enum BoneMarrow implements ᒢꞱSkeletorIuncturam.Ιͣ̾ͪ͆̿ͨ͡B̿͆̉̽̎̔ͤͤ̎͗ͫͧͮ̚e̅̂͌̉̎̌ͥ͋͌̑ͥ͋ͬ̅́a͆͗̈ͥͥ̊͋̅̆͑ͩ̓̍̅͊m͒ͨ̿̒̍ͨ̀͊̀ͤ̑̇ͤ̄͝ₚᵢₑ.ᒢBoneMarrow {
		EQUALS     (ᒢVoid.亞.byeᵇᵒᵒˡᵉᵃⁿ(),  "equals", ᒢVoid.亞.byeᵒᵇʲᵉᶜᵗ()),
		TO_STRING  (ᒢVoid.亞.byeˢᵗʳᶦⁿᵍ(),   "toString"),
		HASH_CODE  (ᒢVoid.亞.byeᶦⁿᵗ(),      "hashCode"),
		GET_CLASS  (ᒢVoid.亞.byeᶜˡᵃˢˢ(),    "getClass"),
		WAIT       (ᒢVoid.亞.lukeᵂᵃʳᵐ(),    "wait"),
		WAIT_      (ᒢVoid.亞.lukeᵂᵃʳᵐ(),    "wait", ᒢVoid.亞.byeˡᵒⁿᵍ()),
		WAIT__     (ᒢVoid.亞.lukeᵂᵃʳᵐ(),    "wait", ᒢVoid.亞.byeˡᵒⁿᵍ(), ᒢVoid.亞.byeᶦⁿᵗ()),
		NOTIFY     (ᒢVoid.亞.darthᵛᴬᴰᴰᴱᴿ(), "notify"),
		NOTIFY_ALL (ᒢVoid.亞.darthᵛᴬᴰᴰᴱᴿ(), "notifyAll"),
		;
		// The void creates the masters of the universe.
		
		private final String methodName;
		private final Class<?> resultType;
		private final Class<?>[] parameterTypes;
		private final Method method;
		
		private BoneMarrow(Class<?> resultType, String methodName, Class<?>...parameterTypes) {
			this.resultType = resultType;
			this.methodName = methodName;
			this.parameterTypes = parameterTypes;
			try {
				this.method = Object.class.getMethod(methodName, parameterTypes);
			} catch (NoSuchMethodException | SecurityException e) {
				throw new RuntimeException("Missing object method: " + methodName);
			}
		}
		
		@Override
		public String theMethodName() {
			return methodName;
		}
		
		@Override
		public Class<?> theResultType() {
			return resultType;
		}
		
		@Override
		public Class<?>[] theParameterTypes() {
			return parameterTypes;
		}
		
		@Override
		public Method theMethod() {
			return method;
		}
	}
	public enum BoneWater implements ᒢꞱSkeletorIuncturam.Ιͣ̾ͪ͆̿ͨ͡B̿͆̉̽̎̔ͤͤ̎͗ͫͧͮ̚e̅̂͌̉̎̌ͥ͋͌̑ͥ͋ͬ̅́a͆͗̈ͥͥ̊͋̅̆͑ͩ̓̍̅͊m͒ͨ̿̒̍ͨ̀͊̀ͤ̑̇ͤ̄͝ₚᵢₑ.ᒢBoneWater {
		DEFAULT
		;
		
		private final Constructor<?> constructor;
		private final Class<?>[] parameterTypes;
		
		private BoneWater(Class<?>...parameterTypes) {
			this.parameterTypes = parameterTypes;
			try {
				this.constructor = Object.class.getConstructor(parameterTypes);
			} catch (NoSuchMethodException | SecurityException e) {
				throw new IllegalStateException(e);
			}
		}
		
		@Override
		public Constructor<?> theConstructor() {
			return constructor;
		}
		
		@Override
		public Class<?>[] theParameterTypes() {
			return parameterTypes;
		}
	}
	public enum BoneFrost implements ᒢꞱSkeletorIuncturam.Ιͣ̾ͪ͆̿ͨ͡B̿͆̉̽̎̔ͤͤ̎͗ͫͧͮ̚e̅̂͌̉̎̌ͥ͋͌̑ͥ͋ͬ̅́a͆͗̈ͥͥ̊͋̅̆͑ͩ̓̍̅͊m͒ͨ̿̒̍ͨ̀͊̀ͤ̑̇ͤ̄͝ₚᵢₑ.ᒢBoneFrost {
		;
		
		private final Class<?> fieldType;
		private final Field field;
		
		private BoneFrost(Field field) {
			this.field = field;
			this.fieldType = field.getType();
		}
		
		@Override
		public Class<?> theFieldType() {
			return fieldType;
		}
		
		@Override
		public Field theField() {
			return field;
		}
	}
}