ae_page_objects icon indicating copy to clipboard operation
ae_page_objects copied to clipboard

Reimplement proxy code of ElementProxy to be less severe

Open dtognazzini opened this issue 10 years ago • 2 comments

ElementProxy undefs a bunch of standard methods on objects:

# Remove all instance methods so even things like class()
# get handled by method_missing(). <lifted from activerecord>
instance_methods.each do |m|
  unless m.to_s =~ /^(?:nil\?|send|object_id|to_a|tap)$|^__|^respond_to/
    undef_method m
  end
end

This undefing is too severe and can cause issues when methods common to most objects are not available. #123 describes an issue with RSpec expectations. Additionally, inspecting instances of ElementProxy in debuggers like Rubymine can sometimes crash the debugger.

Reimplement the proxy code in ElementProxy to be less severe.

Some ideas:

  1. Use SimpleDelegator.
  2. Don't undef any methods.

dtognazzini avatar May 27 '15 20:05 dtognazzini

Another idea here would be to collapse the ElementProxy behavior into Element whereby the internal node attribute would function as the "implicit_element" of ElementProxy.

This would mean that callers would get references to instances of Element subclasses, making is_a? checks easier, but also changing the contract of methods generated by the element DSL.

It's unclear if this change would require a major version bump.

dtognazzini avatar May 27 '15 22:05 dtognazzini

It's unclear if this change would require a major version bump.

Technically removing ElementProxy is a breaking change, which would require a majort version bump. Although, I'm not sure if it was possible to know that ElementProxy actually existed, without looking in the source code

jacob-carlborg avatar May 28 '15 07:05 jacob-carlborg