Module: Browser::DelegateNative
- Included in:
- Element
- Defined in:
- lib/browser/delegate_native.rb
Instance Method Summary collapse
-
#initialize(native) ⇒ Object
Provides a default initializer.
-
#method_missing(message, *args, &block) ⇒ Object
Fall back to native properties.
- #property_for_message(message) ⇒ Object
- #respond_to_missing?(message, include_all) ⇒ Boolean
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 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/browser/delegate_native.rb', line 18 def method_missing , *args, &block if .end_with? '=' = .chop property_name = () return `#@native[#{property_name}] = args[0]` else property_name = () %x{ let value = #@native[#{property_name}]; let type = typeof(value); try { if (type === 'function') { return value.apply(#@native, args); } else if (type === 'object' && (value instanceof HTMLCollection)) { let a = []; for(let i=0; i<value.length; i++) { a[i] = #{Browser::Element.new(`value.item(i)`)}; } value = a; } else if (type === 'object' && (value instanceof HTMLElement)) { value = #{Browser::Element.new(`value`)}; } else if (value === null || type === 'undefined' || (type === 'number' && isNaN(value))) { return nil; } return value; } catch { 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
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/browser/delegate_native.rb', line 56 def () %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
49 50 51 52 53 54 |
# File 'lib/browser/delegate_native.rb', line 49 def respond_to_missing? , include_all = .chop if .end_with? '=' property_name = () return true unless `#{property_name} in #@native` false end |