Patch.pm 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package Logos::Patch;
  2. use strict;
  3. sub new {
  4. my $proto = shift;
  5. my $class = ref($proto) || $proto;
  6. my $self = {};
  7. $self->{LINE} = -1;
  8. $self->{RANGE} = [];
  9. $self->{SOURCE} = undef;
  10. $self->{SQUASH} = 0;
  11. bless($self, $class);
  12. return $self;
  13. }
  14. ##################### #
  15. # Setters and Getters #
  16. # #####################
  17. sub line {
  18. my $self = shift;
  19. if(@_) { $self->{LINE} = shift; }
  20. return $self->{LINE};
  21. }
  22. sub range {
  23. my $self = shift;
  24. if(@_) { @{$self->{RANGE}} = @_; }
  25. return $self->{RANGE};
  26. }
  27. sub start {
  28. my $self = shift;
  29. if(@_) { $self->{RANGE}[0] = shift; }
  30. return $self->{RANGE}[0];
  31. }
  32. sub end {
  33. my $self = shift;
  34. if(@_) { $self->{RANGE}[1] = shift; }
  35. return $self->{RANGE}[1];
  36. }
  37. sub source {
  38. my $self = shift;
  39. if(@_) { $self->{SOURCE} = shift; }
  40. return $self->{SOURCE};
  41. }
  42. sub squash {
  43. my $self = shift;
  44. if(@_) { $self->{SQUASH} = shift; }
  45. return $self->{SQUASH};
  46. }
  47. ##### #
  48. # END #
  49. # #####
  50. sub evalSource {
  51. my $self = shift;
  52. my $source = shift;
  53. my $sourceref = ref($source);
  54. my @lines;
  55. if($sourceref) {
  56. if($sourceref eq "ARRAY") {
  57. for(@$source) {
  58. splice(@lines, scalar @lines, 0, $self->evalSource($_));
  59. }
  60. } else {
  61. push(@lines, $source->eval());
  62. }
  63. } else {
  64. push(@lines, $source);
  65. }
  66. return @lines;
  67. }
  68. sub apply {
  69. my $self = shift;
  70. my $lref = shift;
  71. my $line = $self->{LINE};
  72. my ($start, $end) = @{$self->{RANGE}};
  73. my $source = $self->{SOURCE};
  74. my @lines = $self->evalSource($source);
  75. if(!defined $start) {
  76. push(@lines, ::generateLineDirectiveForPhysicalLine($line));
  77. if($self->{SQUASH}) {
  78. push(@$lref, join('', @lines));
  79. } else {
  80. splice(@$lref, $line, 0, @lines);
  81. }
  82. } else {
  83. substr($lref->[$line], $start, $end-$start) = join('', @lines);
  84. }
  85. return;
  86. }
  87. 1;