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 |
# 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); 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 () %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
39 40 41 42 43 44 |
# File 'lib/browser/delegate_native.rb', line 39 def respond_to_missing? , include_all = .chop if .end_with? '=' property_name = () return true unless `#{property_name} in #@native` false end |