NAME
   `overload::substr' - overload Perl's `substr()' function

SYNOPSIS
    package My::Stringlike::Object;

    use overload::substr;

    sub _substr
    {
       my $self = shift;
       if( @_ > 2 ) {
          $self->replace_substr( @_ );
       }
       else {
          return $self->get_substr( @_ );
       }
    }

    ...

DESCRIPTION
   This module allows an object class to overload the `substr' core
   function, which Perl's `overload' pragma does not allow by itself.

   It is invoked similarly to the `overload' pragma, being passed a single
   named argument which should be a code reference or method name to
   implement the `substr' function.

    use overload::substr substr => \&SUBSTR;

    use overload::substr substr => "SUBSTR";

   The referred method will be invoked as per core's `substr'; namely, it
   will take the string to be operated on (which will be an object in this
   case), an offset, optionally a length, and optionally a replacement.

    $str->SUBSTR( $offset );
    $str->SUBSTR( $offset, $length );
    $str->SUBSTR( $offset, $length, $replacement );

   In each case, whatever it returns will be the return value of the
   `substr' function that invoked it.

   If the `substr' argument is not provided, it defaults to a method called
   `_substr'.

   It is not required that the return value be a plain string; any Perl
   value may be returned unmodified from the `substr' method, or passed in
   as the value of the replacement. This allows objects to behave in
   whatever way is deemed most appropriate.

TODO
   *       More testing - edge cases, especially in LVALUE logic.

   *       Test for memory leaks, especially in LVALUE logic.

   *       Look into / implement fixup of substr() ops compiled before
           module is loaded

   *       Consider if implementations of split(), and `m//' and `s///'
           regexps should be done that also uses the overloaded substr()
           method.

ACKNOWLEDGEMENTS
   With thanks to Matt S Trout <[email protected]> for suggesting the
   possibility, and Joshua ben Jore <[email protected]> for the inspiration by
   way of UNIVERSAL::ref.

AUTHOR
   Paul Evans <[email protected]>