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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Task for easy chaining of different tasks.
  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: Easy chaining of different tasks.
  14. #
  15. # This task allows you to easily combine different tasks into a single,
  16. # more complex task. Given a list of tasks, Task::Chain will execute all
  17. # of those tasks, in the same order as they are given. Task::Chain will
  18. # stop when all tasks are finished, or if a task failed.
  19. #
  20. # Task::Chained will also use the same mutex as the currently active subtask.
  21. #
  22. # <h3>Example</h3>
  23. # The following example creates a Task::Chained task which first stands, then
  24. # waits 3 seconds, and then sits again.
  25. # <pre class="example">
  26. # my $task = new Task::Chained(
  27. #     tasks => [
  28. #         new Task::SitStand(mode => 'stand'),
  29. #         new Task::Wait(seconds => 3),
  30. #         new Task::SitStand(mode => 'sit')
  31. #     ]
  32. # );
  33. # </pre>
  34. package Task::Chained;
  35. # TODO: handle changing mutexes
  36. use strict;
  37. use Modules 'register';
  38. use Task::WithSubtask;
  39. use base qw(Task::WithSubtask);
  40. use Utils::Exceptions;
  41. ##
  42. # Task::Chained->new(...)
  43. #
  44. # Create a new Task::Chained object.
  45. #
  46. # The following arguments are allowed:
  47. # `l
  48. # - All options allowed for Task->new(), except 'mutexes'.
  49. # - tasks (required) - An array of tasks to be run.
  50. # `l`
  51. sub new {
  52. my $class = shift;
  53. my %args = @_;
  54. my $self = $class->SUPER::new(@_, manageMutexes => 1);
  55. if (!$args{tasks}) {
  56. ArgumentException->throw("No tasks specified.");
  57. }
  58. $self->{tasks} = $args{tasks};
  59. if (@{$self->{tasks}}) {
  60. my $mutexes = $self->{tasks}[0]->getMutexes();
  61. $self->setMutexes(@{$mutexes});
  62. }
  63. return $self;
  64. }
  65. sub activate {
  66. my ($self) = @_;
  67. $self->SUPER::activate();
  68. $self->activateNextTask(0);
  69. }
  70. sub iterate {
  71. my ($self) = @_;
  72. return 0 if (!$self->SUPER::iterate());
  73. # No more tasks left, so we're done.
  74. if (@{$self->{tasks}} == 0) {
  75. $self->setDone();
  76. } else {
  77. # The previous subtask is done. Activate next task.
  78. $self->activateNextTask(1);
  79. }
  80. return 1;
  81. }
  82. sub activateNextTask {
  83. my ($self, $assignMutexes) = @_;
  84. if (@{$self->{tasks}}) {
  85. my $task = shift @{$self->{tasks}};
  86. $self->setSubtask($task);
  87. }
  88. }
  89. 1;