# This example illustrates the use of inherit_from to inherit body attribute
# values from another body.
###############################################################################
#+begin_src cfengine3
bundle agent __main__
{
  commands:
      "/bin/true"
        handle => "some meaningful string",
        classes => my_set_some_extra_fancy_classes( "$(this.promiser)",
                                                    "$(this.handle)",
                                                    "some_class_to_handle_dependencies" );

      "/bin/false"
        handle => "some meaningless string",
        classes => my_set_some_extra_fancy_classes( "$(this.promiser)",
                                                    "$(this.handle)",
                                                    "some_class_to_handle_dependencies" );

  reports:
      "Defined classes:$(const.n)$(with)"
        with => join( "$(const.n)", sort( classesmatching( "some_.*"), "lex" ));
}

body classes my_set_some_extra_fancy_classes(x, y, z)
# @brief In addition to the classes set by `set_some_fancy_classes` define `z` when the promise is repaired
{
        inherit_from => set_some_fancy_classes( $(x), $(y) );
        promise_repaired => { "some_fancy_class_${x}_${y}_repaired", $(z) };
}

body classes set_some_fancy_classes(x, y)
# @brief Define a class prefixed with `some_fancy_class_` followed by expansion
#        of `x`_`y` and suffixed with the promise outcome for each promise outcome.
{
        promise_kept => { "some_fancy_class_${x}_${y}_kept" };
        promise_repaired => { "some_fancy_class_${x}_${y}_repaired" };
        repair_failed => { "some_fancy_class_${x}_${y}_notkept" };
        repair_denied => { "some_fancy_class_${x}_${y}_notkept" };
        repair_timeout => { "some_fancy_class_${x}_${y}_notkept" };
}
#+end_src
###############################################################################
#+begin_src example_output
#@ ```
#@    error: Finished command related to promiser '/bin/false' -- an error occurred, returned 1
#@ R: Defined classes:
#@ some_class_to_handle_dependencies
#@ some_fancy_class__bin_false_some_meaningless_string_notkept
#@ some_fancy_class__bin_true_some_meaningful_string_repaired
#@ ```
#+end_src
