# This example shows how classes are automatically canonified when they are
# defined and that you must explicitly canonify when verifying classes.

#+begin_src cfengine3
bundle agent main
{
  classes:

      "my-illegal-class";

  reports:

      # We search to see what class was defined:
      "$(with)" with => join( " ", classesmatching( "my.illegal.class" ) );

      # We see that the illegal class is explicitly not defined.
      "my-illegal-class is NOT defined (as expected, its invalid)"
        unless => "my-illegal-class";

      # We see the canonified form of the illegal class is defined.
      "my_illegal_class is defined"
        if => canonify("my-illegal-class");

      # Note, if takes expressisons, you couldn't do that if it were
      # automatically canonified. Here I canonify the string using with, and use
      # it as part of the expression which contains an invalid classcharacter, but
      # its desireable for constructing expressions.

      "Slice and dice using `with`"
        with => canonify( "my-illegal-class" ),
        if => "linux|$(with)";

}
#+end_src

#+begin_src policy_description
#@ First we promise to define `my-illegal-class`. When the promise is actuated
#@ it is automatically canonified and defined. This automatic canonification is
#@ logged in verbose logs (`verbose: Class identifier 'my-illegal-class' contains illegal characters - canonifying`).
#@ Next several reports prove which form of the class was defined. The last
#@ report shows how `if` takes a class expression, and if you are checking a class
#@ that contains invalid characters you must canonify it.
#+end_src

#+begin_src example_output
#@ ```
#@ R: my_illegal_class
#@ R: my-illegal-class is NOT defined (as expected, its invalid)
#@ R: my_illegal_class is defined
#@ R: Slice and dice using `with`
#@ ```
#+end_src