class Engine2::Action

Attributes

assets[R]
invokable[R]
meta[R]
node[R]
static[R]

Public Class Methods

action_type(at = nil) click to toggle source
# File lib/engine2/action.rb, line 9
def action_type at = nil
    at ? @action_type = at : @action_type
end
http_method(hm = nil) click to toggle source
# File lib/engine2/action.rb, line 13
def http_method hm = nil
    hm ? @http_method = hm : @http_method
end
inherit(&blk) click to toggle source
# File lib/engine2/action.rb, line 21
def inherit &blk
    cls = Class.new self do
        action_type superclass.action_type
    end

    cls.instance_eval &blk if block_given?
    cls
end
inherited(cls) click to toggle source
# File lib/engine2/action.rb, line 17
def inherited cls
    cls.http_method http_method
end
new(node, assets, static = self) click to toggle source
# File lib/engine2/action.rb, line 33
def initialize node, assets, static = self
    @meta = {}
    @node = node
    @assets = assets
    @static = static
end

Public Instance Methods

action_type() click to toggle source
# File lib/engine2/action.rb, line 44
def action_type
    @action_type || (raise E2Error.new("No action_type for action #{self.class}"))
end
arguments(args) click to toggle source
# File lib/engine2/action.rb, line 84
def arguments args
    (@meta[:arguments] ||= {}).merge! args
end
check_anonymous_action_class(name) click to toggle source
# File lib/engine2/action.rb, line 52
def check_anonymous_action_class name
    raise E2Error.new("Defining method '#{name}'' for named class '#{self.class}', consider using #inherit") if self.class.name
end
check_static_action() click to toggle source
# File lib/engine2/action.rb, line 48
def check_static_action
    raise E2Error.new("Static action required") if dynamic?
end
define_invoke(&blk) click to toggle source
# File lib/engine2/action.rb, line 61
def define_invoke &blk
    check_static_action
    define_method :invoke, &blk
    # self.class.class_eval{define_method :invoke, &blk}
end
define_method(name, &blk) click to toggle source
# File lib/engine2/action.rb, line 56
def define_method name, &blk
    check_anonymous_action_class name
    self.class.class_eval{define_method name, &blk}
end
dynamic?() click to toggle source
# File lib/engine2/action.rb, line 92
def dynamic?
    self != @static
end
execute(command) click to toggle source
# File lib/engine2/action.rb, line 88
def execute command
    (@meta[:execute] ||= []) << command
end
freeze_action() click to toggle source
# File lib/engine2/action.rb, line 123
def freeze_action
    hash = @meta
    hash.freeze
    # hash.each_pair{|k, v| freeze(v) if v.is_a? Hash}
    freeze
end
http_method() click to toggle source
# File lib/engine2/action.rb, line 40
def http_method
    @http_method # || (raise E2Error.new("No http method for action #{self.class}"))
end
invoke!(handler) click to toggle source
# File lib/engine2/action.rb, line 67
def invoke! handler
    if rmp = @request_action_proc
        action = self.class.new(node, assets, self)
        result = action.instance_exec(handler, *action.request_action_proc_params(handler), &rmp)
        action.post_process
        response = @requestable ? (result.is_a?(Hash) ? result : {}) : action.invoke(handler)
        response[:meta] = action.meta
        response
    else
        invoke(handler)
    end
end
join_keys(id) click to toggle source
# File lib/engine2/action.rb, line 171
def join_keys id
    Sequel::join_keys(id)
end
lookup(*keys) click to toggle source

def []= *keys, value

@meta.path!(*keys, value)

end

# File lib/engine2/action.rb, line 104
def lookup *keys
    if dynamic? # we are the request action
        value = @meta.path(*keys)
        value.nil? ? @static.meta.path(*keys) : value
        # value || @static.value.path(keys)
    else
        @meta.path(*keys)
    end
end
merge(*keys) click to toggle source
# File lib/engine2/action.rb, line 114
def merge *keys
    if keys.length == 1
        key = keys.first
        dynamic? ? @static.meta[key].merge(@meta[key] || {}) : @meta[key]
    else
        dynamic? ? @static.meta.path(*keys).merge(@meta.path(*keys)) : @meta.path(*keys)
    end
end
node_defined() click to toggle source
# File lib/engine2/action.rb, line 146
def node_defined
end
post_process() click to toggle source
# File lib/engine2/action.rb, line 164
def post_process
end
post_run() click to toggle source
# File lib/engine2/action.rb, line 149
def post_run
    if respond_to? :invoke
        @invokable = true
    else
        if @request_action_proc
            @invokable = true
            @requestable = true
        else
            @meta[:invokable] = false
        end
    end
    @meta[:dynamic_meta] = true if @request_action_proc
    post_process
end
pre_run() click to toggle source
# File lib/engine2/action.rb, line 141
def pre_run
    @action_type = self.class.action_type
    @http_method = self.class.http_method
end
repeat(time) click to toggle source
# File lib/engine2/action.rb, line 80
def repeat time
    @meta[:repeat] = time
end
request(&blk) click to toggle source
# File lib/engine2/action.rb, line 134
def request &blk
    raise E2Error.new("No block given for request action") unless blk
    raise E2Error.new("No request block in request action allowed") if dynamic?
    @request_action_proc = @request_action_proc ? @request_action_proc.chain_args(&blk) : blk
    nil
end
request_action_proc_params(handler) click to toggle source
# File lib/engine2/action.rb, line 130
def request_action_proc_params handler
    []
end
split_keys(id) click to toggle source
# File lib/engine2/action.rb, line 167
def split_keys id
    Sequel::split_keys(id)
end