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 <mst@shadowcat.co.uk> for suggesting the
    possibility, and Joshua ben Jore <jjore@cpan.org> for the inspiration
    by way of UNIVERSAL::ref.

AUTHOR

    Paul Evans <leonerd@leonerd.org.uk>