Module: Johnson::SpiderMonkey::JSLandProxy

Defined in:
lib/johnson/spidermonkey/js_land_proxy.rb

Overview

:nodoc:

Class Method Summary collapse

Class Method Details

.autovivified(target, attribute) ⇒ Object



29
30
31
# File 'lib/johnson/spidermonkey/js_land_proxy.rb', line 29

def self.autovivified(target, attribute)
  target.send(:__johnson_js_properties)[attribute]
end

.autovivified?(target, attribute) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
36
# File 'lib/johnson/spidermonkey/js_land_proxy.rb', line 33

def self.autovivified?(target, attribute)
  target.respond_to?(:__johnson_js_properties) &&
    target.send(:__johnson_js_properties).key?(attribute)
end

.autovivify(target, attribute, value) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/johnson/spidermonkey/js_land_proxy.rb', line 38

def self.autovivify(target, attribute, value)
  (class << target; self; end).instance_eval do
    unless target.respond_to?(:__johnson_js_properties)
      define_method(:__johnson_js_properties) do
        @__johnson_js_properties ||= {}
      end
    end
    
    define_method(:"#{attribute}=") do |arg|
      send(:__johnson_js_properties)[attribute] = arg
    end
    
    define_method(:"#{attribute}") do |*args|
      js_prop = send(:__johnson_js_properties)[attribute]
      if js_prop.is_a?(RubyLandProxy) && js_prop.function?
        js_prop.call_using(self, *args)
      else
        js_prop
      end
    end
  end

  target.send(:"#{attribute}=", value)
end

.js_property?(target, name) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
26
27
# File 'lib/johnson/spidermonkey/js_land_proxy.rb', line 23

def self.js_property?(target, name)
  # FIXME: that rescue is gross; handles, e.g., "name?"
  (target.send(:instance_variable_defined?, "@#{name}") rescue false) ||
    (target.respond_to?(:js_property?) && target.__send__(:js_property?, name))
end

.send_with_possible_block(target, symbol, args) ⇒ Object



14
15
16
17
# File 'lib/johnson/spidermonkey/js_land_proxy.rb', line 14

def self.send_with_possible_block(target, symbol, args)
  block = args.pop if args.last.is_a?(RubyLandProxy) && args.last.function?
  target.__send__(symbol, *args, &block)
end

.treat_all_properties_as_methods(target) ⇒ Object



19
20
21
# File 'lib/johnson/spidermonkey/js_land_proxy.rb', line 19

def self.treat_all_properties_as_methods(target)
  def target.js_property?(name); true; end
end