--- /dev/null
+#!perl -T
+
+use strict;
+use warnings;
+
+{
+ package Lexical::Types::Test::Str;
+
+ use overload '.' => \&_concat,
+ '""' => \&_interpolate,
+ 'cmp' => \&_cmp,
+ fallback => 1;
+
+ sub new {
+ my ($class, $buf) = @_;
+ $class = ref($class) || $class;
+ unless (defined $buf) {
+ $buf = '';
+ } elsif ($buf->isa($class)) {
+ $buf = $buf->{buffer};
+ }
+ bless { buffer => $buf }, $class;
+ }
+
+ sub _concat {
+ my ($self, $str, $r) = @_;
+ $self->new($r ? $str . $self->{buffer} : $self->{buffer} . $str);
+ }
+
+ sub _interpolate { shift->{buffer} }
+
+ sub _cmp {
+ my ($a, $b, $r) = @_;
+ my $bufa = ref($a) ? $a->{buffer} : $a;
+ my $bufb = ref($b) ? $b->{buffer} : $b;
+ my $res = $bufa cmp $bufb;
+ $res = -$res if $r;
+ return $res;
+ }
+
+ sub _typedscalar { __PACKAGE__->new() }
+}
+
+{
+ package Str;
+}
+
+use Test::More tests => 2 * 6;
+
+use Lexical::Types as => sub {
+ return 'Lexical::Types::Test::' . $_[0],
+ '_' . lc($_[1])
+};
+
+for (1 .. 2) {
+ my Str $x;
+
+ isa_ok $x, 'Lexical::Types::Test::Str', '$x';
+ is "$x", '', '$x contains the right thing';
+
+ $x .= "foo";
+ isa_ok $x, 'Lexical::Types::Test::Str', '$x . "foo"';
+ is "$x", 'foo', '$x . "foo" contains the right thing';
+
+ $x = "bar" . $x;
+ isa_ok $x, 'Lexical::Types::Test::Str', '"bar" . $x';
+ is "$x", 'barfoo', '"bar" . $x contains the right thing';
+}