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.

86 lines
1.4 KiB

  1. package MethodSpit;
  2. use strict;
  3. use warnings;
  4. no warnings 'uninitialized';
  5. sub methodspit {
  6. my ($class, @names) = @_;
  7. # These are simple accessors.
  8. foreach my $name (@names) {
  9. makemethod($class, $name);
  10. }
  11. return;
  12. }
  13. # Handy-dandy basic closure:
  14. sub makemethod {
  15. my ($class, $name) = @_;
  16. no strict 'refs';
  17. # Install a generated sub:
  18. *{ "${class}::${name}" } =
  19. sub {
  20. my ($self, $param) = @_;
  21. $self->{$name} = $param if defined $param;
  22. return $self->{$name};
  23. }
  24. }
  25. sub methodspit_depend {
  26. my ($class, $dependency, $names) = @_;
  27. my %names = %{ $names };
  28. foreach my $name (keys %names) {
  29. my $default = $names{$name};
  30. makemethod_depend($class, $dependency, $name, $default);
  31. }
  32. }
  33. # A more complicated closure. Makes a return value dependent on another
  34. # method, if not already explicitly defined.
  35. sub makemethod_depend {
  36. my ($class, $dependency, $name, $default) = @_;
  37. no strict 'refs';
  38. *{ "${class}::${name}" } =
  39. sub {
  40. my ($self, $param) = @_;
  41. if (defined $param) {
  42. $self->{$name} = $param;
  43. }
  44. if (defined $self->{$name}) {
  45. return $self->{$name};
  46. } else {
  47. return $self->$dependency . $default;
  48. }
  49. }
  50. # return;
  51. }
  52. 1;
  53. =pod
  54. =head1 NAME
  55. MethodSpit - quickie method generation
  56. =head1 SYNOPSIS
  57. =head1 DESCRIPTION
  58. The following bits are cheap method generation, in place of using
  59. Class::Accessor or Object::Tiny.
  60. =cut