summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2009-09-28 01:32:47 -0500
committerJesse Luehrs <doy@tozt.net>2009-09-28 01:32:47 -0500
commit5313565d28e14d35f91b5d1be232e5130b8e4b16 (patch)
treecdb6d151522fc70d227c4e2f2d20a48a5573adaa /lib
parent470ece28c84d9486cdcce7751385fb26be5860ec (diff)
downloadlanguage-teco-5313565d28e14d35f91b5d1be232e5130b8e4b16.tar.gz
language-teco-5313565d28e14d35f91b5d1be232e5130b8e4b16.zip
convert the Buffer object to use Moose
Diffstat (limited to 'lib')
-rw-r--r--lib/Language/TECO/Buffer.pm90
1 files changed, 58 insertions, 32 deletions
diff --git a/lib/Language/TECO/Buffer.pm b/lib/Language/TECO/Buffer.pm
index 68550a4..54d0981 100644
--- a/lib/Language/TECO/Buffer.pm
+++ b/lib/Language/TECO/Buffer.pm
@@ -1,45 +1,67 @@
-use strict;
-use warnings;
package Language::TECO::Buffer;
+use Moose;
+use namespace::autoclean;
-sub new {
- my $class = shift;
- my $initial_buffer = shift;
- $initial_buffer = '' unless defined $initial_buffer;
- return bless { buffer => $initial_buffer, pointer => 0 }, $class;
-}
+has _buffer => (
+ traits => ['String'],
+ is => 'rw',
+ isa => 'Str',
+ default => '',
+ init_arg => 'buffer',
+ handles => {
+ _substr_buffer => 'substr',
+ endpos => 'length',
+ },
+);
-sub curpos { shift->{pointer} }
+has curpos => (
+ traits => ['Counter'],
+ is => 'rw',
+ isa => 'Int',
+ default => 0,
+ trigger => sub {
+ my $self = shift;
+ my ($curpos, $oldpos) = @_;
+ # XXX: ick, do this better
+ if ($curpos < 0 || $curpos > $self->endpos) {
+ $self->curpos($oldpos);
+ die "Pointer off page\n";
+ }
+ },
+ handles => {
+ set => 'set',
+ offset => 'inc',
+ },
+);
-sub endpos { length shift->{buffer} }
-
-sub buffer {
- my $self = shift;
- my ($start, $end) = @_;
- $start = 0 if !defined $start || $start < 0;
- $end = $self->endpos if !defined $end || $end > $self->endpos;
- ($start, $end) = ($end, $start) if $start > $end;
- return substr $self->{buffer}, $start, $end - $start;
-}
+around BUILDARGS => sub {
+ my $orig = shift;
+ my $class = shift;
+ shift if !defined($_[0]);
+ unshift @_, 'buffer' if @_ % 2 == 1;
+ return $class->$orig(@_);
+};
-sub set {
+around qw(set offset) => sub {
+ my $orig = shift;
my $self = shift;
- my $pointer = shift;
- die "Pointer off page\n" if $pointer < 0 || $pointer > $self->endpos;
- $self->{pointer} = $pointer;
+ $self->$orig(@_);
return;
-}
+};
-sub offset {
+sub buffer {
my $self = shift;
- $self->set($self->{pointer} + shift);
- return;
+ my ($start, $end) = @_;
+ $start = 0 if !defined $start || $start < 0;
+ $end = $self->endpos if !defined $end || $end > $self->endpos;
+ ($start, $end) = ($end, $start) if $start > $end;
+ return $self->_substr_buffer($start, $end - $start);
}
sub insert {
my $self = shift;
- my $text = shift;
- substr($self->{buffer}, $self->curpos, 0) = $text;
+ my ($text) = @_;
+ $self->_substr_buffer($self->curpos, 0, $text);
$self->offset(length $text);
return;
}
@@ -50,7 +72,7 @@ sub delete {
($start, $end) = ($end, $start) if $start > $end;
die "Pointer off page\n" if $start < 0 || $end > $self->endpos;
- substr($self->{buffer}, $start, $end - $start) = '';
+ $self->_substr_buffer($start, $end - $start, '');
$self->set($start);
return;
}
@@ -59,9 +81,11 @@ sub get_line_offset {
my $self = shift;
my $num = shift;
+ # XXX: what in the world was i thinking... clean this up
if ($num > 0) {
- pos $self->{buffer} = $self->curpos;
- $self->{buffer} =~ /(?:.*(?:\n|$)){0,$num}/g;
+ my $buffer = $self->buffer;
+ pos $buffer = $self->curpos;
+ $buffer =~ /(?:.*(?:\n|$)){0,$num}/g;
return ($-[0], $+[0]) if wantarray;
return $+[0];
}
@@ -76,4 +100,6 @@ sub get_line_offset {
}
}
+__PACKAGE__->meta->make_immutable;
+
1;