def add_step(*args, &block)
      if block_given?
        raise ArgumentError unless args.length == 1
        name = args.first
        step = block
      else
        raise ArgumentError if args.length > 2
        if args.length == 1
          step = args.first
        elsif args.length == 2
          name = args.first
          step = args.last
        end
      end

      name ||= step.name if step.is_a? Class
      name ||= step.class.name

      steps.delete_if { |s| s.first == name }
      step ||= block if block_given?
      steps << [name, step]
    end
def add_step(*args, &block)
      if block_given?
        raise ArgumentError unless args.length == 1
        name = args.first
        step = block
      else
        raise ArgumentError if args.length > 2
        if args.length == 1
          step = args.first
        elsif args.length == 2
          name = args.first
          step = args.last
        end
      end

      name ||= step.name if step.is_a? Class
      name ||= step.class.name

      steps.delete_if { |s| s.first == name }
      step ||= block if block_given?
      steps << [name, step]
    end
Adds a step to be executed when the Hero::Formula is run.
 @note Steps are called in the order they are added. 1st in 1st invoked.

 @example A step must implement the interface.
   def call(*args)

   # or more specifically
   def call(context, options={})

 @example Add a step using a block.
   add_step(:my_step) do |context, options|
     # logic here...
   end

 @example Add a step using an Object.
   class MyStep
     def self.call(context, options={})
       # logic here...
     end
   end

   add_step(MyStep)

 @param optional [Symbol, String] name The name of the step.
 @param optional [Object] step The step to be executed.
 @block optional [Object] A block to use as the step to be executed.