Module: Tap

Defined in:
lib/tap/app.rb,
lib/tap/env.rb,
lib/tap/join.rb,
lib/tap/root.rb,
lib/tap/task.rb,
lib/tap/joins.rb,
lib/tap/intern.rb,
lib/tap/parser.rb,
lib/tap/prompt.rb,
lib/tap/app/api.rb,
lib/tap/signals.rb,
lib/tap/version.rb,
lib/tap/app/node.rb,
lib/tap/env/gems.rb,
lib/tap/app/queue.rb,
lib/tap/app/stack.rb,
lib/tap/app/state.rb,
lib/tap/templater.rb,
lib/tap/joins/sync.rb,
lib/tap/middleware.rb,
lib/tap/root/utils.rb,
lib/tap/tasks/dump.rb,
lib/tap/tasks/load.rb,
lib/tap/env/context.rb,
lib/tap/env/minimap.rb,
lib/tap/env/constant.rb,
lib/tap/env/manifest.rb,
lib/tap/joins/switch.rb,
lib/tap/signals/help.rb,
lib/tap/root/versions.rb,
lib/tap/env/string_ext.rb,
lib/tap/signals/signal.rb,
lib/tap/middlewares/debugger.rb,
lib/tap/signals/class_methods.rb,
lib/tap/signals/module_methods.rb

Defined Under Namespace

Modules: Joins, Middlewares, Signals, Tasks Classes: App, Env, Join, Middleware, Parser, Prompt, Root, Task, Templater

Constant Summary collapse

INTERN_MODULES =

An array of already-declared intern modules, keyed by method_name.

{}
Intern =

An Intern module for :process.

Tap::Intern(:process)
MAJOR =
0
MINOR =
19
TINY =
0
VERSION =
"#{MAJOR}.#{MINOR}.#{TINY}"
WEBSITE =
"http://tap.rubyforge.org"

Class Method Summary collapse

Class Method Details

.Intern(method_name) ⇒ Object

Generates an Intern module to override the specified method_name. Intern modules are useful to override a tiny bit of functionality without having to generate a full subclass.

An Intern module:

  • adds an accessor for <method_name>_block

  • overrides <method_name> to call the block, prepending self to the input arguments

For example:

array = [1,2,3].extend Intern(:last)

array.last             # => 3
array.last_block = lambda {|arr| arr.first }
array.last             # => 3


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/tap/intern.rb', line 20

def self.Intern(method_name)
  mod = INTERN_MODULES[method_name.to_sym]
  return mod unless mod == nil

  mod = INTERN_MODULES[method_name.to_sym] = Module.new
  mod.module_eval %Q{
  attr_accessor :#{method_name}_block

  def #{method_name}(*inputs)
    return super unless #{method_name}_block
    inputs.unshift(self)

    arity = #{method_name}_block.arity
    n = inputs.length
    unless n == arity || (arity < 0 && (-1-n) <= arity) 
      raise ArgumentError.new("wrong number of arguments (\#{n} for \#{arity})")
    end

    #{method_name}_block.call(*inputs)
  end
  }
  mod
end