Class: DSeL::DSL::Nodes::Base

Inherits:
Node show all
Defined in:
lib/dsel/dsl/nodes/base.rb,
lib/dsel/dsl/nodes/base/environment.rb

Direct Known Subclasses

Direct, Proxy

Defined Under Namespace

Modules: Environment

Instance Attribute Summary collapse

Attributes inherited from Node

#parent, #root, #subject

Instance Method Summary collapse

Methods inherited from Node

#_dsel_node, #calc_node_hash, #hash, #root?

Constructor Details

#initializeBase

Returns a new instance of Base.



11
12
13
14
15
16
17
18
# File 'lib/dsel/dsl/nodes/base.rb', line 11

def initialize(*)
    super

    @shared_variables = {}
    @nodes            = {}

    cache_node( self )
end

Instance Attribute Details

#environmentEnvironment (readonly)

Returns:



9
10
11
# File 'lib/dsel/dsl/nodes/base.rb', line 9

def environment
  @environment
end

Instance Method Details

#cache_node(node) ⇒ Object



30
31
32
# File 'lib/dsel/dsl/nodes/base.rb', line 30

def cache_node( node )
    nodes[node.hash] ||= node
end

#node_for(subject, options = {}) ⇒ Object



35
36
37
38
# File 'lib/dsel/dsl/nodes/base.rb', line 35

def node_for( subject, options = {} )
    nodes[calc_node_hash( subject )] ||=
        self.class.new( subject, options.merge( parent: self ) )
end

#nodesObject



21
22
23
# File 'lib/dsel/dsl/nodes/base.rb', line 21

def nodes
    root? ? @nodes : @root.nodes
end

#run(script = nil, &block) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/dsel/dsl/nodes/base.rb', line 40

def run( script = nil, &block )
    if script && block
        fail ArgumentError, 'Cannot use both script and &block.'
    end

    begin
        prepare

        calling do
            if block
                return @environment.instance_eval( &block )
            end

            if script
                @environment.instance_eval do
                    return eval( IO.read( script ) )
                end
            end
        end
    ensure
        # Re-entry, don't touch anything.
        return if calling?

        # May not have been prepared yet.
        return if !@environment.respond_to?( Environment::DSEL_NODE_ACCESSOR )

        cleanup
    end
end

#shared_variablesObject



25
26
27
# File 'lib/dsel/dsl/nodes/base.rb', line 25

def shared_variables
    root? ? @shared_variables : @root.shared_variables
end