Module: Browser::DelegateNative

Included in:
Element
Defined in:
lib/browser/delegate_native.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(message, *args, &block) ⇒ Object

Fall back to native properties. If the message sent to this element is not recognized, it checks to see if it is a property of the native element. It also checks for variations of the message name, such as:

:supported? => [:supported, :isSupported]

If a property with the specified message name is found and it is a function, that function is invoked with ‘args`. Otherwise, the property is returned as is.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/browser/delegate_native.rb', line 18

def method_missing message, *args, &block
  if message.end_with? '='
    message = message.chop
    property_name = property_for_message(message)
    return `#@native[#{property_name}] = args[0]`
  else
    property_name = property_for_message(message)

    %x{
      let value = #@native[#{property_name}];
      let type = typeof(value);
      if (type === 'function') {
        return value.apply(#@native, args);
      } else if (value === null || type === 'undefined' || (type === 'number' && isNaN(value))) {
        return nil;
      }
      return value;
    }
  end
end

Instance Method Details

#initialize(native) ⇒ Object

Provides a default initializer. This should be overridden in all but the simplest cases.



5
6
7
# File 'lib/browser/delegate_native.rb', line 5

def initialize native
  @native = native
end

#property_for_message(message) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/browser/delegate_native.rb', line 46

def property_for_message(message)
  %x{
    let camel_cased_message;
    if (typeof(#@native[message]) !== 'undefined') { camel_cased_message = message; }
    else { camel_cased_message = Opal.Preact.lower_camelize(message) }

    if (camel_cased_message.endsWith('?')) {
      camel_cased_message = camel_cased_message.substring(0, camel_cased_message.length - 2);
      if (typeof(#@native[camel_cased_message]) === 'undefined') {
        camel_cased_message = 'is' + camel_cased_message[0].toUpperCase() + camel_cased_message.substring(0, camel_cased_message.length - 1);
      }
    }
    return camel_cased_message
  }
end

#respond_to_missing?(message, include_all) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
44
# File 'lib/browser/delegate_native.rb', line 39

def respond_to_missing? message, include_all
  message = message.chop if message.end_with? '='
  property_name = property_for_message(message)
  return true unless `#{property_name} in #@native`
  false
end