Module: Command::DSL::Action

Includes:
Formatting
Included in:
Command
Defined in:
lib/command-set/dsl.rb

Overview

The methods available within the DSL::CommandDefinition#action method

The trickiest thing to realize about writing Commands is that a CommandSet is an object that contains several Command subclasses; Commad::setup creates a subclass, and so CommandSet#command does too. It’s when a command is invoked that it’s actually instantiated.

Also note that you can access the arguments of a command as read-only attributes, and you can write to and read from instance variables, which will be local to the invocation of the command. This is especially useful for undo and redo.

Instance Method Summary collapse

Methods included from Formatting

#begin_list, #end_list, #item, #list, #sub_collector

Instance Method Details

#chain(klass_or_path, args) ⇒ Object

It frequently makes sense to offer shortcut chains to the user, or even commands that can only be run as part of another command. Calling chain with either a command class or a command path allows will cause that command to be invoked before returning control to the user.



502
503
504
505
506
507
# File 'lib/command-set/dsl.rb', line 502

def chain(klass_or_path, args)
  setup = CommandSetup.new
  setup.command = klass_or_path
  setup.args_hash = args || {}
  subject.chain_of_command.push(setup)
end

#chain_first(klass_or_path, args) ⇒ Object

Like #chain, but interjects the command being chained to the start of the queue, immediately after this command completes.



511
512
513
514
515
516
# File 'lib/command-set/dsl.rb', line 511

def chain_first(klass_or_path, args)
  setup = CommandSetup.new
  setup.command = klass_or_path
  setup.args_hash = args
  subject.chain_of_command.unshift(setup)
end

#defer(deck = nil) ⇒ Object

Stop here and return control to the user. If several commands are chained (c.f. #chain) and the pause is subsequently resumed (StandardCommands::Resume) the rest of the chain (not this command) will be dropped.

Raises:



476
477
478
# File 'lib/command-set/dsl.rb', line 476

def defer(deck = nil) 
  raise ResumeFromOnlyThis, deck
end

#dont_undoObject

Some commands sometimes cause side effects. When evaluating arguments, if you discover that undoing doesn’t make sense, and will be confusing to the user, call dont_undo, and the interpreter will ignore the call for purposes of undoing



452
453
454
455
# File 'lib/command-set/dsl.rb', line 452

def dont_undo
  @should_undo = false
  return nil
end

#interruptableObject

This method is deprecated but remains as a nicety. As it stands, any command can be interrupted at the command line with Ctrl-C, and return to the prompt.



529
530
531
# File 'lib/command-set/dsl.rb', line 529

def interruptable
  yield
end

#pause(deck = nil) ⇒ Object

Stop here. Return control to the user. If several commands are chained (c.f. #chain) and the pause is subsequently resumed (StandardCommands::Resume) the whole chain will be resumed.

Raises:



468
469
470
# File 'lib/command-set/dsl.rb', line 468

def pause(deck = nil)
  raise ResumeFrom, deck
end

#subjectObject

This is how you’ll access the Command::Subject object that’s the interface of every command to the program state.



459
460
461
# File 'lib/command-set/dsl.rb', line 459

def subject
  @subject
end

#task(id) ⇒ Object

Allows for a command to be broken into pieces so that a resume can pick up within a command. The block will be executed normally, but if the command is resumed with a task id, all task blocks until that id will be skipped.



484
485
486
487
488
489
490
491
492
493
# File 'lib/command-set/dsl.rb', line 484

def task(id) #:yield:
  if not @resume_from.nil?
    if @resume_from == id
      @resume_from = nil
    end
    return
  end
  yield if block_given?
  @last_completed_task = id
end

#undo(box) ⇒ Object

Not normally called from within an #action block, this provides the default behavior for an undo (raise an exception)

Raises:



522
523
524
# File 'lib/command-set/dsl.rb', line 522

def undo(box)
  raise CommandException, "#{@name} cannot be undone"
end