class Needle::DefinitionContext

This class is used by the Needle::Container#define! and Needle::Container#namespace! methods to allow an instance_eval'd block to create new service points simply by invoking imaginary methods. It is basically an empty shell, with almost all of the builtin methods removed from it. (This allows services like “hash” and “print” to be defined, where they would normally conflict with the Kernel methods of the same name.)

Public Class Methods

new( container ) click to toggle source

Create a new DefinitionContext that wraps the given container. All operations performed on this context will be delegated to the container.

# File lib/needle/definition-context.rb, line 41
def initialize( container )
  @container = container
end

Public Instance Methods

has_key?( name ) click to toggle source

Delegates to Needle::Container#has_key?.

# File lib/needle/definition-context.rb, line 103
def has_key?( name )
  @container.has_key?( name )
end
intercept( name ) click to toggle source

Delegate to Needle::Container#intercept.

# File lib/needle/definition-context.rb, line 52
def intercept( name )
  @container.intercept( name )
end
knows_key?( name ) click to toggle source

Delegates to Needle::Container#knows_key?.

# File lib/needle/definition-context.rb, line 108
def knows_key?( name )
  @container.knows_key?( name )
end
method_missing( sym, *args, &block ) click to toggle source

Any method invocation with no block and no parameters is interpreted to be a service reference on the wrapped container, and delegates to Needle::Container#[]. If the block is not given but the args are not empty, a NoMethodError will be raised.

If a block is given, this delegates to Needle::Container#register, leaving all parameters in place.

# File lib/needle/definition-context.rb, line 119
def method_missing( sym, *args, &block )
  if block.nil?
    @container.get( sym, *args )
  else
    @container.register( sym, *args, &block )
  end
end
namespace( *parms, &block ) click to toggle source

Delegate to Needle::Container#namespace.

# File lib/needle/definition-context.rb, line 57
def namespace( *parms, &block )
  @container.namespace( *parms, &block )
end
namespace!( *parms, &block )
Alias for: namespace_define!
namespace_define( *parms, &block ) click to toggle source

Delegate to Needle::Container#define on the new namespace.

# File lib/needle/definition-context.rb, line 69
def namespace_define( *parms, &block )
  @container.namespace( *parms ) { |ns| ns.define( &block ) }
end
namespace_define!( *parms, &block ) click to toggle source

Delegate to Needle::Container#namespace_define!.

# File lib/needle/definition-context.rb, line 62
def namespace_define!( *parms, &block )
  @container.namespace_define!( *parms, &block )
end
Also aliased as: namespace!
require( *parms ) click to toggle source

Delegate to Needle::Container#require on the current container.

# File lib/needle/definition-context.rb, line 74
def require( *parms )
  # this is necessary to work around an rdoc bug...rdoc doesn't like
  # calling require with a variable number of arguments.
  @container.__send__( :require, *parms )
end
this_container() click to toggle source

A way to access the container reference being operated on from within the context.

# File lib/needle/definition-context.rb, line 47
def this_container
  @container
end
use( opts, &block ) click to toggle source

Delegate to Needle::Container#use on the current container, but yields the definition context instead of the container.

# File lib/needle/definition-context.rb, line 82
def use( opts, &block )
  use! @container.defaults.merge( opts ), &block
end
use!( opts ) { |self| ... } click to toggle source

Delegate to Needle::Container#use! on the current container, but yields the definition context instead of the container.

# File lib/needle/definition-context.rb, line 88
def use!( opts )
  original = @container.use!( opts )

  if block_given?
    begin
      yield self
    ensure
      @container.use! original
    end
  end

  original
end