class DSeL::DSL::Nodes::Direct

Public Instance Methods

extend_env() click to toggle source
# File lib/dsel/dsl/nodes/direct.rb, line 11
def extend_env
    [
        Environment,
        Mixins::Environment::IvarExplorer
    ]
end
reset_methods() click to toggle source
# File lib/dsel/dsl/nodes/direct.rb, line 18
def reset_methods
    [
        :instance_variables,
        :method_missing
    ]
end

Private Instance Methods

capture_subject() click to toggle source
# File lib/dsel/dsl/nodes/direct.rb, line 38
def capture_subject
    @original_methods = reset_methods.map do |m|
        @subject.instance_eval do
            method( m ) if respond_to? m
        end
    end.compact
end
cleanup_environment() click to toggle source
# File lib/dsel/dsl/nodes/direct.rb, line 34
def cleanup_environment
    restore_subject
end
decorate_subject() click to toggle source
# File lib/dsel/dsl/nodes/direct.rb, line 46
def decorate_subject
    # We could use @subject.extend but that only works the first time.
    extend_env.each do |mod|
        mod.instance_methods( true ).each do |m|
            @subject.instance_eval do
                define_singleton_method m, mod.instance_method( m )
            end
        end
    end
end
prepare_environment() click to toggle source
# File lib/dsel/dsl/nodes/direct.rb, line 27
def prepare_environment
    capture_subject
    decorate_subject

    @environment = @subject
end
restore_subject() click to toggle source
# File lib/dsel/dsl/nodes/direct.rb, line 57
def restore_subject
    cmethods = @subject.methods
    extend_env.each do |mod|
        mod.instance_methods( true ).each do |m|
            next if !cmethods.include?( m )
            @subject.instance_eval( "undef :'#{m}'" )
        end
    end

    @original_methods.each do |m|
        @subject.define_singleton_method m.name, &m
    end
end