Subclass.pm 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package Selenium::Subclass;
  2. #ABSTRACT: Generic template for Selenium sugar subclasses like Selenium::Session
  3. use strict;
  4. use warnings;
  5. no warnings 'experimental';
  6. use feature qw/signatures/;
  7. =head1 CONSTRUCTOR
  8. =head2 $class->new($parent Selenium::Client, $data HASHREF)
  9. You should probably not use this directly; objects should be created as part of normal operation.
  10. =cut
  11. sub new ($class,$parent,$data) {
  12. my %lowkey;
  13. @lowkey{map { lc $_ } keys(%$data)} = values(%$data);
  14. $lowkey{parent} = $parent;
  15. my $self = bless(\%lowkey,$class);
  16. $self->_build_subs($class);
  17. return $self;
  18. }
  19. sub _request ($self, $method, %params) {
  20. #XXX BAD SPEC AUTHOR, BAD!
  21. if ( $self->{sortfield} eq 'element-6066-11e4-a52e-4f735466cecf') {
  22. $self->{sortfield} = 'elementid';
  23. $self->{elementid} = delete $self->{'element-6066-11e4-a52e-4f735466cecf'};
  24. }
  25. # Inject our sortField param, and anything else we need to
  26. $params{$self->{sortfield}} = $self->{$self->{sortfield}};
  27. my $inject = $self->{to_inject};
  28. @params{keys(%$inject)} = values(%$inject) if ref $inject eq 'HASH';
  29. # and insure it is injected into child object requests
  30. $params{inject} = $self->{sortfield};
  31. $self->{callback}->($self,$method,%params) if $self->{callback};
  32. return $self->{parent}->_request($method, %params);
  33. }
  34. sub DESTROY($self) {
  35. return if ${^GLOBAL_PHASE} eq 'DESTRUCT';
  36. $self->{destroy_callback}->($self) if $self->{destroy_callback};
  37. }
  38. #TODO filter spec so we don't need parent anymore, and can have a catalog() method
  39. sub _build_subs($self,$class) {
  40. #Filter everything out which doesn't have {sortField} in URI
  41. my $k = lc($self->{sortfield});
  42. #XXX deranged field name
  43. $k = 'elementid' if $self->{sortfield} eq 'element-6066-11e4-a52e-4f735466cecf';
  44. foreach my $sub (keys(%{$self->{parent}{spec}})) {
  45. next unless $self->{parent}{spec}{$sub}{uri} =~ m/{\Q$k\E}/;
  46. Sub::Install::install_sub(
  47. {
  48. code => sub {
  49. my $self = shift;
  50. return $self->_request($sub,@_);
  51. },
  52. as => $sub,
  53. into => $class,
  54. }
  55. ) unless $class->can($sub);
  56. }
  57. }
  58. 1;