[o] volute 'prev' => 'new' { ... } [o] volute Module { ... } [o] obj.vset(:a => 0, :b => 1) [o] volute { over } [o] volute Class { volute :attr { } } --> Class AND attr volute Class, :attr { } --> Class OR attr [o] volute :not, Light { ... } [o] volute /^att/ { ... } [o] not including Volute, but triggering Volute.xxx on some changes [o] volute :att => :not_nil { ... } (not a nil value) [o] volute :att => [ a, b ] { ... } (a or b) [o] volute previous_value => [ val0, val1 ] { ... } (OR) [o] volute [ pval0, pval1 ] => value { ... } (OR) [o] volute :att => /regex/ { ... } [o] volute /regex/ => /regex/ { ... } [o] rewrite README head [o] readme : list alternatives (aspects/hooks/callbacks) [ ] volute Invoice do volute :paid do if is(true) object.comment = 'got paid' elsif was(nil) object.comment = 'still not paid' end end end [x] multi-entity state machine example not happy with the traffic light example [ ] volutes `-- volute x, y `-- volute a, b [ ] pass the object as block binding ?