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
-
.Intern(method_name) ⇒ Object
Generates an Intern module to override the specified method_name.
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 |