Sha256: c6d9a2c9c6b0545166bca3c66532d7b0bc1808c96f440d2c00f355c6feb4f34d

Contents?: true

Size: 984 Bytes

Versions: 2

Compression:

Stored size: 984 Bytes

Contents

require "missile_emitter/version"
require "missile_emitter/battle_field"

begin 
  require "pry" 
rescue LoadError
end

module MissileEmitter

  class Error < StandardError; end

  @mapping = {}

  class << self
    attr_accessor :mapping

    def exec(&block)
      raise Error.new("需要提供代码块") unless block_given?

      context = block.binding.eval 'self'

      raise Error.new("只能再具名模块中调用") unless context.instance_of?(Module) && context.name

      mimic_method context

      mapping[context] = block
    end

    private

    def mimic_method(context)
      # TODO:处理多层命名空间的情况
      Kernel.define_method context.name do |&missile|
        klass = missile.binding.eval 'self'
        battle_field = BattleField.new klass, MissileEmitter.mapping[context]
        battle_field.emit! &missile

        context
      end
    end
  end

end

module Kernel
  def MissileEmitter(&block)
    MissileEmitter.exec &block
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
missile_emitter-0.1.3 lib/missile_emitter.rb
missile_emitter-0.1.2 lib/missile_emitter.rb