Almost-minimal filesystem based blog.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
2.1 KiB

12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
16 years ago
  1. =pod
  2. =head1 NAME
  3. App::WRT::MethodSpit - quickie method generation
  4. =head1 SYNOPSIS
  5. # In Foo.pm:
  6. package Foo;
  7. use base 'App::WRT::MethodSpit';
  8. %default = (
  9. baz => 'bar,
  10. biz => 'buz'
  11. );
  12. # Set up accessor methods:
  13. __PACKAGE__->methodspit( keys %default );
  14. sub new {
  15. my $class = shift;
  16. my %params = @_;
  17. my %copy_of_default = %default;
  18. my $self = \%copy_of_default;
  19. bless $self, $class;
  20. $self->configure(%params);
  21. return $self;
  22. }
  23. # In calling code:
  24. $obj = Foo->new(
  25. baz => 'waffle'
  26. );
  27. say $obj->baz; # waffle
  28. say $obj->biz; # buz
  29. =head1 DESCRIPTION
  30. Cheap method generation, in place of using Class::Accessor or Object::Tiny.
  31. Kind of stupid.
  32. =cut
  33. package App::WRT::MethodSpit;
  34. use strict;
  35. use warnings;
  36. no warnings 'uninitialized';
  37. sub methodspit {
  38. my ($class, @names) = @_;
  39. # These are simple accessors.
  40. foreach my $name (@names) {
  41. makemethod($class, $name);
  42. }
  43. return;
  44. }
  45. # Handy-dandy basic closure:
  46. sub makemethod {
  47. my ($class, $name) = @_;
  48. no strict 'refs';
  49. # Install a generated sub:
  50. *{ "${class}::${name}" } =
  51. sub {
  52. my ($self, $param) = @_;
  53. $self->{$name} = $param if defined $param;
  54. return $self->{$name};
  55. }
  56. }
  57. sub methodspit_depend {
  58. my ($class, $dependency, $names) = @_;
  59. my %names = %{ $names };
  60. foreach my $name (keys %names) {
  61. my $default = $names{$name};
  62. makemethod_depend($class, $dependency, $name, $default);
  63. }
  64. }
  65. # A more complicated closure. Makes a return value dependent on another
  66. # method, if not already explicitly defined.
  67. sub makemethod_depend {
  68. my ($class, $dependency, $name, $default) = @_;
  69. no strict 'refs';
  70. *{ "${class}::${name}" } =
  71. sub {
  72. my ($self, $param) = @_;
  73. if (defined $param) {
  74. $self->{$name} = $param;
  75. }
  76. if (defined $self->{$name}) {
  77. return $self->{$name};
  78. } else {
  79. return $self->$dependency . $default;
  80. }
  81. }
  82. }
  83. # Set specified parameters:
  84. sub configure {
  85. my $self = shift;
  86. my %params = @_;
  87. for my $p (keys %params) {
  88. $self->{$p} = $params{$p};
  89. }
  90. return;
  91. }
  92. 1;