Function.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Task which accept a function as iterate method.
  3. #  Copyright (c) 2007 OpenKore Developers
  4. #
  5. #  This software is open source, licensed under the GNU General Public
  6. #  License, version 2.
  7. #  Basically, this means that you're allowed to modify and distribute
  8. #  this software. However, if you distribute modified versions, you MUST
  9. #  also distribute the source code.
  10. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  11. #########################################################################
  12. ##
  13. # MODULE DESCRIPTION: Task which accept a function as iterate method.
  14. #
  15. # This is a convenience task for those who want to write a simple task
  16. # without declaring an entire class. Here's an example:
  17. # <pre class="example">
  18. # new Task::Function(function => sub {
  19. #     # $task is the Task::Function object.
  20. #     my ($task) = @_;
  21. #     print "Hello worldn";
  22. #     $task->setDone();
  23. # });
  24. # </pre>
  25. #
  26. # The above is almost equivalent to:
  27. # <pre class="example">
  28. # package Task::SomeRandomName;
  29. #
  30. # use Task;
  31. # use base qw(Task);
  32. #
  33. # sub iterate {
  34. #     my ($self) = @_;
  35. #     print "Hello worldn";
  36. #     $self->setDone();
  37. # }
  38. #
  39. # my $task = new Task::SomeRandomName();
  40. # </pre>
  41. #
  42. # You can also use object methods. Specify the 'object' argument, like this:
  43. # <pre class="example">
  44. # new Task::Function(
  45. #     object => $self,
  46. #     function => sub {
  47. #         my ($self, $task) = @_;
  48. #         print "Hello worldn";
  49. #         $task->setDone();
  50. #     }
  51. # );
  52. # </pre>
  53. package Task::Function;
  54. use strict;
  55. use Modules 'register';
  56. use Task;
  57. use base qw(Task);
  58. use Scalar::Util;
  59. use Utils::Exceptions;
  60. ##
  61. # Task::Function->new(...)
  62. #
  63. # Create a new Task::Function object.
  64. #
  65. # The following arguments are allowed:
  66. # `l
  67. # - All options allowed for Task->new()
  68. # - function (required) - A reference to a function to be run as iterate() method.
  69. # - object - A class object. Specify this argument if _function_ is supposed to be an object method.
  70. #            This object will be passed to that function as the first parameter.
  71. # - weak - Whether _object_ should internally be stored as a weak reference.
  72. #          This is useful to prevent problems with circular references.
  73. # `l`
  74. sub new {
  75. my $class = shift;
  76. my %args = @_;
  77. my $self = $class->SUPER::new(@_);
  78. if (!$args{function}) {
  79. ArgumentException->throw("No function argument given.");
  80. }
  81. $self->{function} = $args{function};
  82. if ($args{object}) {
  83. $self->{object} = $args{object};
  84. Scalar::Util::weaken($self->{object}) if ($args{weak});
  85. }
  86. return $self;
  87. }
  88. sub iterate {
  89. my ($self) = @_;
  90. if (exists $self->{object}) {
  91. if ($self->{object}) {
  92. $self->{function}->($self->{object}, $self);
  93. } else {
  94. # $self->{object} exists but is undef. Apparently
  95. # it was a weak reference and the referee is destroyed.
  96. # So complete the task.
  97. $self->setDone();
  98. }
  99. } else {
  100. $self->{function}->($self);
  101. }
  102. }
  103. 1;