Sha256: 240e11985d27d619dc4c928bbfba441d3abd963d03ca78973c921c50977af9cc

Contents?: true

Size: 1.38 KB

Versions: 1

Compression:

Stored size: 1.38 KB

Contents

class AngryMob
  class Target
    class Call
      attr_reader :args, :klass, :actions
      attr_accessor :target

      def initialize(klass,args)
        @klass = klass
        @args  = Arguments.parse(args)
        validate_actions!
      end

      def self.instance_key(klass,args)
        klass.instance_key(Arguments.parse(args))
      end

      def instance_key
        self.class.instance_key(klass,args)
      end

      def add_args(new_args)
        @args = Arguments.parse(new_args).update_preserving_actions(args)
        validate_actions!
      end

      def merge_defaults(defaults)
        args.reverse_deep_merge!(defaults)
      end

      def call(act, hints={})
        target.act = act
        target.noticing_changes(args) {
          actions.each {|action|
            target.send(action)
          }
        }
      end

      def nickname
        klass.nickname
      end

      def validate_actions!
        @actions = args.actions

        extras = actions - klass.all_actions
        raise(ArgumentError, "#{nickname}() unknown actions #{extras.inspect} known=#{klass.all_actions.inspect}") unless extras.empty? || extras == ['nothing']

        actions << klass.default_action_name if actions.empty?

        if actions.norm.empty?
          raise ArgumentError, "#{klass.nickname}() no actions selected, and no default action defined"
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
angry_mob-0.1.0 lib/angry_mob/target/call.rb