support boolean values and suppliers being set for dsl predicate / conditions
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java b/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java
index 76efad2..d185c7a 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java
@@ -93,6 +93,7 @@
 
         // could use json shorthand instead, but this is simpler
         TypeCoercions.registerAdapter(String.class, DslPredicate.class, DslPredicates::implicitlyEqualTo);
+        TypeCoercions.registerAdapter(Boolean.class, DslPredicate.class, DslPredicates::always);
 
 //        TypeCoercions.registerAdapter(DeferredSupplier.class, DslPredicate.class, DslPredicates::implicitlyEqualTo);
 //        TypeCoercions.registerAdapter(WorkflowExpressionResolution.WrappedUnresolvedExpression.class, DslPredicate.class, DslPredicates::implicitlyEqualTo);
@@ -503,6 +504,11 @@
                     return nestedPredicateCheck((DslPredicate) test, result);
                 }
 
+                if (test instanceof Boolean) {
+                    // if a boolean is supplied as an implicit, return it; it was probably a condition
+                    return (Boolean) test;
+                }
+
                 if ((!(test instanceof BrooklynObject) && value instanceof BrooklynObject) ||
                         (!(test instanceof Iterable) && value instanceof Iterable)) {
                     throw new IllegalStateException("Implicit value used for equality check comparing "+test+" with "+value+", which is probably not what was meant. Use explicit 'equals: ...' syntax for this case.");
@@ -1057,6 +1063,10 @@
         return result;
     }
 
+    public static DslPredicate always(boolean x) {
+        return x ? alwaysTrue() : alwaysFalse();
+    }
+
     public static DslPredicate equalTo(Object x) {
         DslEntityPredicateDefault result = new DslEntityPredicateDefault();
         result.equals = WrappedValue.of(x);
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java b/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java
index 016059e..a043064 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java
@@ -26,12 +26,15 @@
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.core.predicates.DslPredicates.DslPredicate;
+import org.apache.brooklyn.util.core.task.DeferredSupplier;
+import org.apache.brooklyn.util.javalang.AtomicReferences;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
 import org.testng.annotations.Test;
 
 import java.util.Arrays;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
@@ -609,4 +612,42 @@
         Asserts.assertFailsWith(() -> { p2.test(MutableList.of("x", "zz")); }, e -> Asserts.expectedFailureContainsIgnoreCase(e, "assert", "value", "zz"));
     }
 
+    @Test
+    public void testCoercionAndSuppliers() {
+        DslPredicates.DslPredicate p;
+
+        p = TypeCoercions.coerce("yessir", DslPredicates.DslPredicate.class);
+        Asserts.assertTrue(p.test("yessir"));
+        Asserts.assertFalse(p.test("no sir"));
+
+        p = TypeCoercions.coerce( (DeferredSupplier) ()->"yessir", DslPredicates.DslPredicate.class);
+        Asserts.assertTrue(p.test("yessir"));
+        Asserts.assertFalse(p.test("no sir"));
+
+        AtomicReference fickle = new AtomicReference("yessir");
+        p = TypeCoercions.coerce( (DeferredSupplier) ()->fickle.get(), DslPredicates.DslPredicate.class);
+        Asserts.assertTrue(p.test("yessir"));
+        Asserts.assertFalse(p.test("no sir"));
+        fickle.set("no sir");
+        Asserts.assertFalse(p.test("yessir"));
+        Asserts.assertTrue(p.test("no sir"));
+
+        // now boolean, especially atomic boolean
+        Asserts.assertTrue(TypeCoercions.coerce(true, DslPredicates.DslPredicate.class).test("anything"));
+        Asserts.assertFalse(TypeCoercions.coerce(false, DslPredicates.DslPredicate.class).test("anything"));
+
+        fickle.set(true);
+        Asserts.assertTrue(p.test(true));
+        Asserts.assertTrue(p.test("anything"));
+        Asserts.assertTrue(p.test(false));
+
+        fickle.set(false);
+        Asserts.assertFalse(p.test(true));
+        Asserts.assertFalse(p.test("anything"));
+        Asserts.assertFalse(p.test(false));
+
+        p = TypeCoercions.coerce( (DeferredSupplier) ()->false, DslPredicates.DslPredicate.class);
+        Asserts.assertFalse(p.test("anything"));
+    }
+
 }