class AbstractOption implements Option {
    
    private final String key;
    private final String value;
    
    AbstractOption(String key, String value) {
        this.key   = requireNonNull(key);
        this.value = requireNonNull(value);
    }

    @Override
    public final String getKey() {
        return key;
    }

    @Override
    public final String getValue() {
        return value;
    }

    @Override
    public final int hashCode() {
        int hash = 5;
        hash = 53 * hash + Objects.hashCode(this.key);
        hash = 53 * hash + Objects.hashCode(this.value);
        return hash;
    }

    @Override
    public final boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

    @Override
    public String toString() {
        return key + '=' + value;
    }
}

        if (this == obj) return true;
        else if (obj == null) return false;
        else if (getClass() != obj.getClass()) return false;
        
        final Option other = (Option) obj;
        return Objects.equals(this.key, other.getKey())
            && Objects.equals(this.value, other.getValue());
    
<no_super_class>