package org.apache.commons.proxy2.interceptor.matcher.argument;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.proxy2.interceptor.matcher.ArgumentMatcher;

public final class ArgumentMatcherUtils
{
//----------------------------------------------------------------------------------------------------------------------
// Static Methods
//----------------------------------------------------------------------------------------------------------------------

    public static ArgumentMatcher any()
    {
        return new AnyMatcher();
    }

    public static ArgumentMatcher eq(final Object value)
    {
        return new EqualsMatcher(value);
    }

    public static ArgumentMatcher isA(final Class<?> type)
    {
        return new InstanceOfMatcher(type);
    }

    public static ArgumentMatcher isNull()
    {
        return new IsNullMatcher();
    }

    public static ArgumentMatcher notNull()
    {
        return new NotNullMatcher();
    }

    public static ArgumentMatcher same(final Object ref)
    {
        return new SameMatcher(ref);
    }

//----------------------------------------------------------------------------------------------------------------------
// Constructors
//----------------------------------------------------------------------------------------------------------------------

    private ArgumentMatcherUtils()
    {
        
    }

//----------------------------------------------------------------------------------------------------------------------
// Inner Classes
//----------------------------------------------------------------------------------------------------------------------

    private static class AnyMatcher implements ArgumentMatcher
    {
        @Override
        public boolean matches(Object argument)
        {
            return true;
        }
    }

    private static class EqualsMatcher implements ArgumentMatcher
    {
        private final Object value;

        public EqualsMatcher(Object value)
        {
            this.value = value;
        }

        @Override
        public boolean matches(Object argument)
        {
            return ObjectUtils.equals(argument, value);
        }
    }

    private static class InstanceOfMatcher implements ArgumentMatcher
    {
        private final Class<?> type;

        public InstanceOfMatcher(Class<?> type)
        {
            this.type = type;
        }

        @Override
        public boolean matches(Object argument)
        {
            return type.isInstance(argument);
        }
    }

    private static class IsNullMatcher implements ArgumentMatcher
    {
        @Override
        public boolean matches(Object argument)
        {
            return argument == null;
        }
    }

    private static class NotNullMatcher implements ArgumentMatcher
    {
        @Override
        public boolean matches(Object argument)
        {
            return argument != null;
        }
    }

    private static class SameMatcher implements ArgumentMatcher
    {
        private final Object ref;

        public SameMatcher(Object ref)
        {
            this.ref = ref;
        }

        @Override
        public boolean matches(Object argument)
        {
            return argument == ref;
        }
    }
}
