private <T> T accept(Expression<T> expr) {
        return expr.accept(this);
    }
@Test
    public void testNumberReference() throws Exception {
        final String ref = "abc123";

        assertThat(Expr.Equal.create(
                Expr.NumberReference.create(ref),
                Expr.NumberValue.create(42)
        ).accept(new BooleanNumberConditionsVisitor(Collections.singletonMap(ref, 42d))))
                .isTrue();

        assertThatThrownBy(() -> Expr.Equal.create(
                Expr.NumberReference.create(ref),
                Expr.NumberValue.create(42)).accept(new BooleanNumberConditionsVisitor()))
                .isInstanceOf(IllegalArgumentException.class);

        assertThatThrownBy(() -> Expr.Equal.create(
                Expr.NumberReference.create("abc"),
                Expr.NumberValue.create(42)).accept(new BooleanNumberConditionsVisitor(Collections.singletonMap(ref, 42d))))
                .isInstanceOf(IllegalArgumentException.class);

        assertThat(loadCondition("condition-number-reference.json")
                .accept(new BooleanNumberConditionsVisitor(Collections.singletonMap("foo", 2d))))
                .isTrue();
    }