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 for suggesting the possibility, and Joshua ben Jore for the inspiration by way of UNIVERSAL::ref. AUTHOR Paul Evans