When the run_once clause is present and set to a truthy value, the
instruction it is attached to will only be executed the first time it is
encountered.
Script variables are not longer saved before entering a block. Only
variables declared as locals and loop variables are saved. This allows a
block to use `set_var` to change a variable.
* Separate implementation that acts as a MutableMapping
* I'm still not sure about this. Also, there is a design error in
there, because it's not possible to "return" a value from a block
unless it's written to a fact.
* When the loop value is a list, its items may be templates or
structures which contain templates. Because of that, they need to go
through the templar.
* When the loop variable state is restored, the cache must also be
modified.
* What needs to be done depends on whether a host fact by the same
name also exist.
* Fuck that cache thing. It's going away next time I can hack on this.
* When a block is done executing, local variables must be restored to
their previous values ; however, host variables may have been
updated inside the block. Therefore it is necessary to reset the
variable cache.
* Loops caused local scripts variables to be backed up then restored,
which would have caused a set_var in a loop to have no effect.
* Instead, we back up the state of the variable (existing or not,
value) and either restore the original value or delete the variable
if it didn't exist.
* Support for dumping parsed programs as strings (both a basic,
repr-like version and an indented version that is easier to read)
* Display the parsed program if verbosity is high enough
* Program tracing if verbosity is high enough
* The `add_host` option can be used to add the current host to the
group being created. It avoids having to use a separate `add_host`
instruction in this case.
* The `parent` option can specify the parent group. It avoids having
to use a separate `add_child` instruction in this case.
The "block" instruction allows mulitple instructions to be grouped in
order to be executed based on a single condition, in a common loop, with
a local variable scope. In addition, it provides a way to recover from
errors.