in reply to Re^3: Who am I? Inheritance question
in thread Who am I? Inheritance question

Mock objects respond better to blessed() than ref(). Being an mock object implies that it's blessed in the class that it's mocking.

My criteria for good software:
  1. Does it work?
  2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?

Replies are listed 'Best First'.
Re^5: Who am I? Inheritance question
by diotalevi (Canon) on Mar 17, 2006 at 06:09 UTC

    Respond better how? If I've an object blessed into Ye::Olde::Proxy and it provides all the interface of Real::Deal, what can it do to inform blessed() that it should return Real::Deal instead of Ye::Olde::Proxy? Ye::Olde::Proxy would be too accurate since the proxy object wants to appear to everyone except itself to be a Real::Deal object. With ref(), it can install its own function into CORE::ref that knows how to lie properly. Is the idea that it's easier to get a lying blessed() function than it is to override CORE::ref()?

    ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

      package Scalar::Util; my $old_blessed = do { no strict 'refs'; delete ${ "Scalar::Util::blessed" }; }; sub blessed { my $val = $old_blessed->(@_); if ( defined $val && $val eq 'Ye::Olde::Proxy' ) { return 'Real::Deal'; } return $val; }

      Update: Fixed bug.


      My criteria for good software:
      1. Does it work?
      2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?

        Just an FYI, \&foo isn't a valid target for delete(). If your example even works, it's a bug.

        ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

Re^5: Who am I? Inheritance question
by adrianh (Chancellor) on Mar 17, 2006 at 13:37 UTC
    Being an mock object implies that it's blessed in the class that it's mocking.

    It does? That's the way that the current mock object CPAN modules tend to do it - but it doesn't have to be. I've done mocking with subclasses, and with completely unrelated classes that duck type to the bit that I happen to be testing.