From 5313565d28e14d35f91b5d1be232e5130b8e4b16 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 28 Sep 2009 01:32:47 -0500 Subject: convert the Buffer object to use Moose --- lib/Language/TECO/Buffer.pm | 90 +++++++++++++++++++++++++++++---------------- 1 file 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; -- cgit v1.2.3-54-g00ecf