lib/finite_machine/dsl.rb in finite_machine-0.10.2 vs lib/finite_machine/dsl.rb in finite_machine-0.11.0

- old
+ new

@@ -87,11 +87,11 @@ # @return [StateMachine] # # @api public def initial(value, options = {}) state = (value && !value.is_a?(Hash)) ? value : raise_missing_state - name, self.defer, silent = parse(options) + name, self.defer, silent = *parse_initial(options) self.initial_event = name event(name, FiniteMachine::DEFAULT_STATE => state, silent: silent) end # Trigger initial event @@ -189,11 +189,11 @@ # Error handler that throws exception when machine is in illegal state # # @api public def handlers(&block) - errors.call(&block) + errors_dsl.call(&block) end # Decide whether to log transitions # # @api public @@ -205,31 +205,28 @@ # Initialize state machine properties based off attributes # # @api private def initialize_attrs - attrs[:initial] and initial(attrs[:initial]) - attrs[:target] and target(attrs[:target]) - attrs[:terminal] and terminal(attrs[:terminal]) + attrs[:initial] && initial(attrs[:initial]) + attrs[:target] && target(attrs[:target]) + attrs[:terminal] && terminal(attrs[:terminal]) log_transitions(attrs.fetch(:log_transitions, false)) end # Parse initial options # - # @param [Object] value + # @param [Hash] options + # the options to extract for initial state setup # # @return [Array[Symbol,String]] # # @api private - def parse(value) - if value.is_a?(Hash) - [value.fetch(:event) { FiniteMachine::DEFAULT_EVENT_NAME }, - value.fetch(:defer) { false }, - value.fetch(:silent) { true }] - else - [FiniteMachine::DEFAULT_EVENT_NAME, false, true] - end + def parse_initial(options) + [options.fetch(:event) { FiniteMachine::DEFAULT_EVENT_NAME }, + options.fetch(:defer) { false }, + options.fetch(:silent) { true }] end # Raises missing state error # # @raise [MissingInitialStateError] @@ -244,10 +241,11 @@ end end # DSL # A DSL for describing events class EventsDSL < GenericDSL + include Safety # Create event and associate transition # # @example # event :go, :green => :yellow # event :go, :green => :yellow, if: :lights_on? @@ -255,9 +253,10 @@ # @return [Transition] # # @api public def event(name, attrs = {}, &block) sync_exclusive do + detect_event_conflict!(name) attributes = attrs.merge!(name: name) if block_given? merger = ChoiceMerger.new(machine, attributes) merger.instance_eval(&block) else