package Scalar; use strict; use warnings; use Exporter qw( import ); use Scalar::Util qw( blessed ); our @EXPORT = qw( sc ); use overload '+' => \&_overload_add, '*' => \&_overload_multi, '""' => \&_overload_str, fallback => 1; sub new { my $class = shift; my $self = bless \my ( $sc ), $class; if (@_) { $$self = join('', @_); } return $self; } sub sc { return __PACKAGE__->new( @_ ); } sub _overload_str { my ( $self ) = @_; return $$self; } sub _overload_add { my ( $one, $two, $opt ) = @_; if ($opt) { ($one,$two) = ($two,$one); } return sc( $one, $two ); } sub _overload_multi { my ( $one, $two ) = @_; return undef if (blessed($one) and blessed($two)); ($one, $two) = ($two, $one) if (blessed($two)); return sc( "$one" x $two ); } sub length { my ( $self ) = @_; return length( $$self ); } 1;