DOKK / manpages / debian 12 / libuniversal-ref-perl / UNIVERSAL::ref.3pm.en
UNIVERSAL::ref(3pm) User Contributed Perl Documentation UNIVERSAL::ref(3pm)

UNIVERSAL::ref - Turns ref() into a multimethod

  # True! Wrapper pretends to be Thing.
  ref( Wrapper->new( Thing->new ) )
    eq ref( Thing->new );
  package Thing;
  sub new { bless [], shift }
  package Wrapper;
  sub new {
      my ($class,$proxy) = @_;
      bless \ $proxy, $class;
  }
  sub ref {
      my $self = shift @_;
      return $$self;
  }

This module changes the behavior of the builtin function ref(). If ref() is called on an object that has requested an overloaded ref, the object's "->ref" method will be called and its return value used instead.

To enable this feature for a class, "use UNIVERSAL::ref" in your class. Here is a sample proxy module.

  package Pirate;
  # Pirate pretends to be a Privateer
  use UNIVERSAL::ref;
  sub new { bless {}, shift }
  sub ref { return 'Privateer' }

Anywhere you call "ref($obj)" on a "Pirate" object, it will allow "Pirate" to lie and pretend to be something else.

A pragma for ref()-enabling your class. This adds the calling class name to a global list of ref()-enabled classes.

    package YourClass;
    use UNIVERSAL::ref;
    sub ref { ... }
    
A pragma for ref()-disabling your class. This removes the calling class name from a global list of ref()-enabled classes.

Currently UNIVERSAL::ref must be installed before any ref() calls that are to be affected.

I think ref() always occurs in an implicit scalar context. There is no accomodation for list context.

UNIVERSAL::ref probably shouldn't allow a module to lie to itself. Or should it?

ambrus for the excellent idea to overload defined() to allow Perl 5 to have Perl 6's "interesting values of undef."

chromatic for pointing out how utterly broken ref() is. This fix covers its biggest hole.

Joshua ben Jore - jjore@cpan.org

The standard Artistic / GPL license most other perl code is typically using.

2022-10-20 perl v5.36.0